3

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

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

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

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

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

谢谢您的帮助。

标记

4

4 回答 4

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

希望这可以帮助。

于 2010-01-08T01:12:32.080 回答
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...
}
于 2010-01-08T01:56:43.847 回答
0

您需要调用SendMessage API 函数将鼠标消息发送到您的父控件。

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

于 2010-01-07T23:52:48.137 回答
0

我确实有这个问题......但想出了一个不同的答案。如果您的 WndProc 中有消息,则只需将句柄更改为父句柄,然后将其传递。

我需要在派生的 TextBox 中执行此操作... TextBox 会吃滚轮事件,即使它的 ScrollBars 设置为 None。我希望那些传播到表格。所以,我只是把它放在我派生的 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;
于 2012-11-08T16:32:43.617 回答