【问题标题】:Can't resize borderless form无法调整无边框表单的大小
【发布时间】:2018-11-22 19:43:08
【问题描述】:

如何通过在表单外部抓取 5px 来使无边框表单变大?

我已经尝试过使用 WndProc 覆盖的方式,但这种方式无法在子控件上运行,并且无法在表单之外使用。

还有其他解决方案可以像任何其他窗口一样调整无边框表单的大小吗?

【问题讨论】:

  • “像任何其他窗口一样”——没有支持操作系统级别大小调整的无边框窗口。
  • 看看我对 aleroot 的回答的评论。
  • @Blindy 例如,办公软件是定制设计的形式,它的大小从绘制形式之外的几个像素开始。怎么可能做出这样的定制设计形式?
  • 它不能在表单“外部”,它下方的任何窗口都会获得鼠标事件。 Look here,可能是here,如果真正的问题是你有一个控件冲洗边缘。

标签: c# winforms resizable wndproc borderless


【解决方案1】:
protected override void WndProc(ref Message m){
        const int RESIZE_HANDLE_SIZE = 10;

        switch (m.Msg)
        {
            case 0x0084/*NCHITTEST*/ :
                base.WndProc(ref m);

                if ((int)m.Result == 0x01/*HTCLIENT*/)
                {
                    Point screenPoint = new Point(m.LParam.ToInt32());
                    Point clientPoint = this.PointToClient(screenPoint);
                    if (clientPoint.Y <= RESIZE_HANDLE_SIZE)
                    {
                        if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                            m.Result = (IntPtr)13/*HTTOPLEFT*/ ;
                        else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                            m.Result = (IntPtr)12/*HTTOP*/ ;
                        else
                            m.Result = (IntPtr)14/*HTTOPRIGHT*/ ;
                    }
                    else if (clientPoint.Y <= (Size.Height - RESIZE_HANDLE_SIZE))
                    {
                        if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                            m.Result = (IntPtr)10/*HTLEFT*/ ;
                        else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                            m.Result = (IntPtr)2/*HTCAPTION*/ ;
                        else
                            m.Result = (IntPtr)11/*HTRIGHT*/ ;
                    }
                    else
                    {
                        if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                            m.Result = (IntPtr)16/*HTBOTTOMLEFT*/ ;
                        else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                            m.Result = (IntPtr)15/*HTBOTTOM*/ ;
                        else
                            m.Result = (IntPtr)17/*HTBOTTOMRIGHT*/ ;
                    }
                }
                return;
        }
        base.WndProc(ref m);
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.Style |= 0x20000; // <--- use 0x20000
            return cp;
        }
    }

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2011-09-22
    • 1970-01-01
    • 2013-07-18
    相关资源
    最近更新 更多