如何将消息从子用户控件传递给父用户

时间:2010-01-07 23:34:40

标签: c# .net winforms parent-child messages

这是一个Windows Forms / .Net C#问题。

我有一个无边框窗口,其透明度键和背景色使其完全透明。窗口内有几个用户控件。

我希望能够移动窗口。我知道如何在父窗口上执行此操作,但我的问题是子控件是唯一可见的东西,因此唯一可点击的东西。

问题是:如何将某些消息传递给Parent,以便当鼠标右键按下并且鼠标移动到任何一个子控件上时,Parent可以移动?

或许你可以建议另一种方式?

感谢您的帮助。

标记

4 个答案:

答案 0 :(得分:7)

即使没有使用System.Windows.Forms.Message类的SendMessage,您也可以实现目标。如果您已完成拖动,我猜您熟悉WM_NCLBUTTONDOWN消息。从控件的MouseDown事件发送给您的父级。

以下是移动表单,单击控件label1的示例。请注意第一行,其中sender用于从单击的控件中释放捕获。这样,您可以将此处理程序设置为用于移动表单的所有控件。

这是移动表单的完整代码。不需要任何其他东西。


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);
}

希望这有帮助。

答案 1 :(得分:7)

我认为最简单的方法是将此事件添加到您的子控件:

/// <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...
}

答案 2 :(得分:0)

您需要调用SendMessage API函数将mouse messages发送到您的父控件。

通过覆盖控件的WndProc方法可能最容易做到这一点。

答案 3 :(得分:0)

我有这个问题......但想出了一个不同的答案。 如果你的WndProc中有Message,你只需将句柄更改为Parent的句柄然后传递它。

我需要在派生的TextBox中执行此操作...即使将其ScrollBars设置为None,TextBox也会使用滚轮事件。我希望那些传播到表格上。所以,我只是把它放在我的派生TextBox的WndProc中:

            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;