【发布时间】:2011-12-16 18:12:06
【问题描述】:
所以我只是使用 DwmExtendFrameIntoClientArea(Vista / 7 Aero 的东西)将表单的玻璃区域扩展到客户区域。
我已经在重写 Form 类方法 OnMouseDown() 中发送了一条 Windows 消息,导致窗口可以随玻璃区域移动,如 Make a borderless form movable? 此处所述。
但是,正因为如此,当我点击展开的玻璃区域时,我没有收到任何表单 Click / MouseClick / DoubleClick 等事件。
当我双击顶部展开的玻璃区域时,我实际上希望表单最大化,就像普通标题栏一样。
Form-inheriting 类的代码如下:
protected override void OnMouseDown(MouseEventArgs e)
{
// Fensterverschiebung in Glass-Regionen
if (_glassMovable && e.Button == MouseButtons.Left
&& (e.X < _glassPadding.Left || e.X > Width - _glassPadding.Right
|| e.Y < _glassPadding.Top || e.Y > Height - _glassPadding.Bottom))
{
NativeMethods.ReleaseCapture();
NativeMethods.SendMessage(Handle, NativeMethods.WM_NCLBUTTONDOWN,
NativeMethods.HT_CAPTION, 0);
}
base.OnMouseDown(e);
}
protected override void OnMouseDoubleClick(MouseEventArgs e)
{
// Fenstermaximierung / Minimierung in Glass-Regionen
if (MaximizeBox && e.Button == MouseButtons.Left && e.Y < _glassPadding.Top)
{
if (WindowState == FormWindowState.Normal)
{
WindowState = FormWindowState.Maximized;
}
else if (WindowState == FormWindowState.Maximized)
{
WindowState = FormWindowState.Normal;
}
}
base.OnMouseDoubleClick(e);
}
有什么方法可以让它工作吗?
【问题讨论】:
-
您需要发布代码。我确实知道处理此问题的事件与点击最大化按钮的能力有关。如果它被禁用,那么双击标题栏将什么也不做,它实际上禁用了表单最大化的能力,至少在 WinForms 的演员中。
-
@Ramhound:好的,我添加了当前鼠标相关的代码。
-
您在正确的轨道上发送
HT_CAPTION消息,但您不应该在 WinForms 事件处理程序中执行此操作。Form类有一个原生的WndProc()过程,您应该为您的表单覆盖它以便发送HT_CAPTION。我不记得确切的代码了,但是I have a similar code sample for WPF。 -
你没有从那个答案中得到很好的建议。在搜索框中输入“wm_nchittest”。
-
@BoltClock:谢谢!这很有帮助。你知道我也可以通过右键获取窗口系统菜单吗?
标签: c# winforms winapi aero-glass