如何将无边框表单捕捉到屏幕边缘?

时间:2015-05-24 07:58:42

标签: c# .net winforms

当我将表单的边框样式设置为none时,我无法再将窗口捕捉到屏幕边缘。我怎么能同时拥有这两个?

2 个答案:

答案 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;
   }

}