我正在寻找一种使用菜单栏移动窗体的方法。使用菜单栏移动无边界窗体
虽然有一些解决方案,但有一个特殊的问题,我不喜欢它们。为了让这些方法在拖动菜单条之前工作,表单需要已经集中。
是否有解决该特定问题的方法,以便菜单行将实际上表现得像一个正确的Windows标题栏?
我正在寻找一种使用菜单栏移动窗体的方法。使用菜单栏移动无边界窗体
虽然有一些解决方案,但有一个特殊的问题,我不喜欢它们。为了让这些方法在拖动菜单条之前工作,表单需要已经集中。
是否有解决该特定问题的方法,以便菜单行将实际上表现得像一个正确的Windows标题栏?
最好的选择是使用pinvoke。绑定您希望可拖动的控件“mousedown”。
using System.Runtime.InteropServices;
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
private static extern int SendMessage(IntPtr hWnd,
int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
private static extern bool ReleaseCapture();
public Form1()
{
InitializeComponent();
}
private void menuStrip1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
这仍然需要形式为重点,但您可以解决使用鼠标悬停。这不是那么优雅,但它的工作原理。
private void menuStrip1_MouseHover(object sender, EventArgs e)
{
Focus();
}
更新:哈弗有轻微的延迟,鼠标移动更加敏感
private void menuStrip1_MouseMove(object sender, MouseEventArgs e)
{
if (!Focused)
{
Focus();
}
}
添加MouseHover事件完成了这项工作,谢谢。似乎有点慢,所以如果你很快尝试拖动窗口可能无法正常工作。 MouseEnter事件似乎并没有受到这个问题的困扰。 – denied66 2012-03-30 02:56:46
MouseMove比mousehover快得多,试试吧。 – 2012-03-30 03:23:57
虽然MouseMove触发了很多次,并且考虑到用户的鼠标可能恰好经过菜单栏,这将成为一个问题。 MouseEnter似乎足够快地触发(到目前为止我似乎没有任何问题),并且只触发一次。由于开销很小,因此也不需要if语句。 – denied66 2012-03-30 03:36:29
这是的WinForms?并可以列出其他解决方案,以便我们可以看看,谢谢 – 2012-03-30 02:15:08
正如标题所说,是的,它是winforms :)我目前使用的方法类似于http://stackoverflow.com上的方法/ questions/1592876/c-sharp-make-a-borderless-form-movable – denied66 2012-03-30 02:26:33
请不要在“Winforms:”等前加上标题。这就是标签的用途。 – 2012-03-30 03:57:42