当我将窗体的边框样式设置为无时,我无法再将窗口捕捉到屏幕边缘。我怎样才能两者兼得?
Aero Snap 需要一个有边框的窗口,没有后门。您可以使用以下代码来模拟捕捉这个帖子 https://stackoverflow.com/a/591734/17034.
这与用户从 Aero Snap 获得的交互式反馈仍然相差甚远。获得无边框窗口的方法不止一种,另一种方法是拦截WM_NCCALCSIZE 消息 https://msdn.microsoft.com/en-us/library/windows/desktop/ms632634%28v=vs.85%29.aspx。 Windows 发送的消息,让应用程序有机会覆盖窗口的客户区大小。那是very很容易做到,将 FormBorderStyle 属性设置回 Sizing 并将此代码粘贴到您的 Form 类中:
protected override void WndProc(ref Message m) {
const int WM_NCCALCSIZE = 0x83;
if (m.Msg == WM_NCCALCSIZE && m.WParam.ToInt32() == 1) {
m.Result = new IntPtr(0xF0); // Align client area to all borders
return;
}
base.WndProc(ref m);
}
请注意,您可能已经重写了此方法以使窗口变大。只需使用此代码更新即可。
每一次这样的黑客攻击都会产生另一个问题,你的窗口的客户区现在太大了。边框和窗口标题的尺寸更大。解决这个问题很棘手,Aero 会影响边框尺寸,并且您必须确保 DPI 的自动缩放仍然正常工作。将 FormBorderStyle 设置回 None 并使 Form 的构造函数如下所示:
public Form1() {
InitializeComponent();
var designSize = this.ClientSize;
this.FormBorderStyle = FormBorderStyle.Sizable;
this.Size = designSize;
}
请记住,即使窗口现在打开了边框样式标志,您仍然不会获得投影。很难修复,CS_DROPSHADOW 已经尽力了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)