【发布时间】:2017-04-09 20:19:50
【问题描述】:
基本上,我有一个可以通过鼠标单击Mouse_Down 移动的表单,并且该表单的中间有一个标签,显示一些文本。问题是,当在标签框架内发生点击时,表单不会移动,当我禁用标签时,表单会移动,但是文本颜色会更改为黑色,而它应该是白色的。
【问题讨论】:
基本上,我有一个可以通过鼠标单击Mouse_Down 移动的表单,并且该表单的中间有一个标签,显示一些文本。问题是,当在标签框架内发生点击时,表单不会移动,当我禁用标签时,表单会移动,但是文本颜色会更改为黑色,而它应该是白色的。
【问题讨论】:
这是我使用的标准代码(当我有无边框表单时):
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 事件连接到相同的代码。
【讨论】:
有两种解决方案:
1.
通过覆盖表单的Control.PreProcessMessage 来编写消息预处理方法。在这种方法中,您必须处理 Windows 消息,这并不难,但您必须习惯它。 pinvoke.net 在这里可以提供很多帮助。
2.
将MouseDown 事件处理程序添加到表单中的所有控件,如下所示:
foreach( Control control in this.Controls )
{
control.MouseDown += myMouseDownHandler;
}
myMouseDownHandler 本质上与您用于表单本身的方法相同。
如果您的表单包含嵌套控件,例如在面板或用户表单中,您将必须扩展循环,以便它还处理表单控件的子控件。
如果您的表单中唯一的控件是这个 laben,那么您当然不需要循环。
【讨论】: