Как передать сообщения от дочернего пользовательского элемента управления родителю - PullRequest
3 голосов
/ 08 января 2010

Это вопрос Windows Forms / .Net C #.

У меня есть окна без полей, ключ прозрачности и цвет фона которых делают его полностью прозрачным. Внутри окна есть пара пользовательских элементов управления.

Я хочу иметь возможность перемещать окно. Я знаю, как это сделать в родительском окне, но моя проблема в том, что дочерние элементы управления - это единственное видимое и, следовательно, единственное, что можно щелкнуть.

Вопрос: как я могу передать определенные сообщения Родителю, чтобы Родитель мог двигаться, когда правая кнопка мыши нажата, а мышь перемещается на любом из дочерних элементов управления?

Или, может быть, вы можете предложить другой способ?

Спасибо за помощь.

Mark

Ответы [ 4 ]

7 голосов
/ 08 января 2010

Вы можете достичь своей цели даже без SendMessage, используя класс System.Windows.Forms.Message. Если вы сделали перетаскивание, я думаю, вы знакомы с сообщением WM_NCLBUTTONDOWN. Отправьте его родителю из события MouseDown вашего элемента управления.

Вот пример для перемещения формы, нажав на элемент управления label1. Обратите внимание на первую строку, где отправитель используется для освобождения захвата от элемента управления, по которому щелкнули. Таким образом, вы можете установить этот обработчик для всех элементов управления, предназначенных для перемещения вашей формы.

Это полный код для перемещения формы. Больше ничего не нужно.


public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;

private void label1_MouseDown(object sender, MouseEventArgs e)
{
      (sender as Control).Capture = false;
      Message msg = Message.Create(Handle, WM_NCLBUTTONDOWN, (IntPtr)HT_CAPTION, IntPtr.Zero);
      base.WndProc(ref msg);
}

Надеюсь, это поможет.

7 голосов
/ 08 января 2010

Я думаю, что самый простой способ - добавить это событие в ваши дочерние элементы управления:

/// <summary>
/// The event that you will throw when the mouse hover the control while being clicked 
/// </summary>
public event EventHandler MouseRightClickedAndHoverChildControl;

После этого все, что нужно сделать родителю, это подписаться на эти события и выполнить операции по перемещению родителя:

ChildControl.MouseRightClickedAndHoverChildControl += OnMouseHoverChildControl;

private void OnMouseHoverChildControl(object sender, EventArgs e)
{
    //do foo...
}
0 голосов
/ 08 ноября 2012

У меня был именно этот вопрос ... но придумал другой ответ. Если у вас есть Сообщение в вашем WndProc, вы можете просто изменить дескриптор на дескриптор вашего Родителя, а затем передать его.

Мне нужно было сделать это в нашем производном TextBox ... TextBox ест события колеса прокрутки, даже если его ScrollBars установлены в None. Я хотел, чтобы они распространялись вплоть до Формы. Итак, я просто помещаю это в WndProc для моего производного TextBox:

            case 0x020A: // WM_MOUSEWHEEL
            case 0x020E: // WM_MOUSEHWHEEL
                if (this.ScrollBars == ScrollBars.None && this.Parent != null)
                    m.HWnd = this.Parent.Handle; // forward this to your parent
                base.WndProc(ref m);
                break;

            default:
                base.WndProc(ref m);
                break;
0 голосов
/ 08 января 2010

Вам необходимо вызвать функцию API SendMessage , чтобы отправлять сообщения мыши на родительский элемент управления.

Вероятно, проще всего это сделать, переопределив метод WndProc вашего элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...