C# 在标签内单击鼠标时,如何移动窗体?C 基本上,我有一个可以用鼠标点击鼠标下移的表单,这个表单中间有一个标签,显示了一些文本。问题是,当标签框内出现单击时,表单不会移动,当我禁用标签时,表单会移动,但文本颜色会变为黑色,而它本应为白色

C# 在标签内单击鼠标时,如何移动窗体?C 基本上,我有一个可以用鼠标点击鼠标下移的表单,这个表单中间有一个标签,显示了一些文本。问题是,当标签框内出现单击时,表单不会移动,当我禁用标签时,表单会移动,但文本颜色会变为黑色,而它本应为白色,c#,winforms,C#,Winforms,有两种解决方案: 一, 通过重写窗体的Control.PreProcessMessage编写消息预处理方法。在这种方法中,您必须处理Windows消息,这并不难做到,但您必须习惯它。在这里我能帮上大忙 二, 将MouseDown事件处理程序添加到表单中的所有控件,如下所示: foreach( Control control in this.Controls ) { control.MouseDown += myMouseDownHandler; } myMouseDownHandle

有两种解决方案:

一,

通过重写窗体的Control.PreProcessMessage编写消息预处理方法。在这种方法中,您必须处理Windows消息,这并不难做到,但您必须习惯它。在这里我能帮上大忙

二,

将MouseDown事件处理程序添加到表单中的所有控件,如下所示:

foreach( Control control in this.Controls )
{
     control.MouseDown += myMouseDownHandler;
}
myMouseDownHandler本质上与表单本身使用的方法相同。 如果窗体包含嵌套控件(如在面板或用户窗体中),则必须扩展循环,以便它也处理窗体控件的子控件


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

这是我在使用无边界表单时使用的标准代码:

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事件连接到此代码。

是第一种方法的示例。