这是一个Windows Forms / .Net C#问题。
我有一个无边框窗口,其透明度键和背景色使其完全透明。窗口内有几个用户控件。
我希望能够移动窗口。我知道如何在父窗口上执行此操作,但我的问题是子控件是唯一可见的东西,因此唯一可点击的东西。
问题是:如何将某些消息传递给Parent,以便当鼠标右键按下并且鼠标移动到任何一个子控件上时,Parent可以移动?
或许你可以建议另一种方式?
感谢您的帮助。
标记
答案 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;