如何在标签中单击鼠标时移动表单? C#

时间:2017-04-09 05:21:44

标签: c# winforms

基本上,我有一个表单可以通过鼠标单击backside移动,并且此表单中间有一个标签显示一些文本。问题是,当标签框架内发生单击时,表单不会移动,当我禁用标签时,表单会移动但文本颜色会变为黑色,而它应该是白色的。

2 个答案:

答案 0 :(得分:3)

有两种解决方案:

1

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

2

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

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

myMouseDownHandler基本上与您用于表单本身的方法相同。 如果表单包含嵌套控件(如面板或用户表单),则必须对循环进行扩展,以便它还处理窗体控件的子控件。

如果您表单中的唯一控件是此实验,那么您当然不需要循环。

答案 1 :(得分: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);
    }
} 

我认为只要点击Form的标题栏就会伪造。

当然,您可以将MouseDown事件从任意数量的其他控件(包括表单)连接到同一代码。