2017-04-09 96 views
-1

基本上,我有一个表单,我可以通过点击鼠标来移动Mouse_Down,并且此表单在中间显示一些标签,显示一些文本。问题在于当标签框架内发生点击时,表单不会移动,并且当我禁用标签时,表单会移动,但当文本颜色应该是白色时,文本颜色会变为黑色。如何在标签内点击鼠标时移动窗体? C#

回答

2

这是标准的代码我使用(当我有一个无国界的形式):

using System.Runtime.InteropServices; 
.. 
public const int WM_NCLBUTTONDOWN = 0xA1; 
public const int HT_CAPTION = 0x2; 

[DllImportAttribute("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 
[DllImportAttribute("user32.dll")] 
public static extern bool ReleaseCapture(); 

private void YourLabel_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     ReleaseCapture(); 
     SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
    } 
} 

我觉得这假货曾触及窗体的标题栏。

当然,您可以将任意数量的其他控件(包括窗体)中的MouseDown事件挂接到此代码。

3

解决办法有两个:

1.

通过重写表单的Control.PreProcessMessage写消息预处理方法。在这种方法中,你必须处理Windows消息,这并不难,但你必须习惯它。 pinvoke.net可以在这里帮助很多。

2.

添加MouseDown事件处理程序,所有的控件在你的形式,像这样:

foreach(Control control in this.Controls) 
{ 
    control.MouseDown += myMouseDownHandler; 
} 

myMouseDownHandler将主要是您使用窗体本身同样的方法。 如果表单包含嵌套控件(如面板或用户表单),则必须扩展循环,以便它还处理表单控件的子控件。

如果你的表单中唯一的控件是这个实例,那么当然你不需要循环。

+0

[This](http://stackoverflow.com/a/11043661/815938)是第一种方法的一个例子。 – kennyzx