1
当我将窗体的边框样式设置为none时,我不能再将窗口捕捉到屏幕的边缘。我怎么能有两个?如何将无边框表单对齐到屏幕边缘?
当我将窗体的边框样式设置为none时,我不能再将窗口捕捉到屏幕的边缘。我怎么能有两个?如何将无边框表单对齐到屏幕边缘?
Aero Snap需要一个带边框的窗口,没有后门。您可以使用this post中的代码模拟对齐。
这与用户从Aero Snap获得的交互式反馈相差甚远。有多种方法可以获得无边框窗口,另一种方法是拦截WM_NCCALCSIZE message。 Windows发送的消息使应用程序有机会覆盖窗口的客户区大小。这是非常容易做到的,设置FormBorderStyle属性回缩放和相互这段代码粘贴到您的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回无,使表看起来像这样的构造:
public Form1() {
InitializeComponent();
var designSize = this.ClientSize;
this.FormBorderStyle = FormBorderStyle.Sizable;
this.Size = designSize;
}
请记住,即使窗口现在已经边框样式标志开启,你仍然不会得到一个下拉阴影。很难解决,CS_DROPSHADOW是一样好。