基本上,我有一个表单可以通过鼠标单击backside
移动,并且此表单中间有一个标签显示一些文本。问题是,当标签框架内发生单击时,表单不会移动,当我禁用标签时,表单会移动但文本颜色会变为黑色,而它应该是白色的。
答案 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
事件从任意数量的其他控件(包括表单)连接到同一代码。