当我将表单的边框样式设置为none时,我无法再将窗口捕捉到屏幕边缘。我怎么能同时拥有这两个?
答案 0 :(得分:1)
Aero Snap需要一个带边框的窗户,没有后门。您可以使用this post中的代码模拟对齐。
这与用户从Aero Snap获得的互动反馈相去甚远。获得无边界窗口的方法不止一种,另一种方法是拦截WM_NCCALCSIZE message。 Windows发送的消息,为应用程序提供覆盖窗口的客户区大小的机会。那个非常很容易做到,将FormBorderStyle属性设置回Sizable并将此代码粘贴到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就像它一样好。
答案 1 :(得分:-1)
只是提供了一个我没有设法在stackoverflow上获得它的选择。
从here获得了此代码。
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
{
cp.Style |= 0x20000 | 0x80000 | 0x40000; //WS_MINIMIZEBOX | WS_SYSMENU | WS_SIZEBOX;
}
return cp;
}
}