Mousewheel прокручивают в панели с динамично добавленными средствами управления полем изображения?

этому нужен php5, я украл его из docs.php.net и отредактировал конец.

я использую его для контроля, когда ошибка происходит на клиентском сайте, это отсылает данные мне, не держа вывод

function do_post_request($url, $data, $optional_headers = null,$getresponse = false) {
    $params = array(
        'http' => array(
            'method' => 'POST',
            'content' => $data
        )
    );
    if ($optional_headers !== null) {
         $params['http']['header'] = $optional_headers;
    }
    $ctx = stream_context_create($params);
    $fp = @fopen($url, 'rb', false, $ctx);

    if (!$fp) {
        return false;
    }

    if ($getresponse) {
        $response = stream_get_contents($fp);
        return $response;
    }
    return true;
}
5
задан thejartender 2 June 2012 в 08:41
поделиться

2 ответа

"cwick" совершенно верно, Windows отправляет уведомление WM_MOUSWHEEL окну, которое имеет фокус. Он работает, когда вы помещаете кнопку на панель, потому что она может получить фокус. Следующее, что происходит, - это то, что Windows продолжает искать родительский элемент управления, чтобы принять сообщение. Button не заботится об этом, это панель Parent, и она с радостью прокручивает и принимает сообщение.

Кроме того, чтобы лечить дочерние элементы управления способностью брать фокус (вам придется переопределить их и вызвать SetStyle ( ControlStyles.Selectable)), вы можете подумать об изменении способа обработки этого сообщения. Многие коммерческие приложения, похоже, не имеют этой проблемы (браузеры, приложения Office), потому что у них всего несколько окон. WF-приложений обычно много, по одному для каждого элемента управления. Сделайте это, обработав сообщение раньше, прежде чем он будет отправлен в сфокусированный элемент управления. Интерфейс IMessageFilter позволяет это. Этот пример кода прокручивает элемент управления под мышкой вместо элемента управления, который имеет фокус:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsApplication1 {
  public partial class Form1 : Form, IMessageFilter {
    public Form1() {
      InitializeComponent();
      Application.AddMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m) {
      if (m.Msg == 0x20a) {
        // WM_MOUSEWHEEL, find the control at screen position m.LParam
        Point pos = new Point(m.LParam.ToInt32());
        IntPtr hWnd = WindowFromPoint(pos);
        if (hWnd != IntPtr.Zero && hWnd != m.HWnd && Control.FromHandle(hWnd) != null) {
          SendMessage(hWnd, m.Msg, m.WParam, m.LParam);
          return true;
        }
      }
      return false;
    }

    // P/Invoke declarations
    [DllImport("user32.dll")]
    private static extern IntPtr WindowFromPoint(Point pt);
    [DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
  }
}

Помните, что этот код активен для любого окна в вашем приложении. Обязательно попробуйте и убедитесь, что это не слишком запутает пользователя.

3
ответ дан 14 December 2019 в 01:10
поделиться

The panel scrolls with the mousewheel when it or a control within it has focus. The problem you are running into is that neither the PictureBox nor the panel receives focus when you click on it. If you call select() on the panel, you will see that the mouse wheel starts working again.

One possible solution would be to select the panel whenever the mouse cursor enters it, by handling the Control.MouseEnter event:

void panel1_MouseEnter(object sender, EventArgs e)
{
    panel1.select();
}
6
ответ дан 14 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: