【问题标题】:Borderless Form Resizing Glitch无边界表单调整大小故障
【发布时间】:2017-02-08 10:00:44
【问题描述】:

我想要制作无边框的表格。 我的问题是,当我想要调整表单大小(在左侧或顶部)时,另一侧的表单正在跳跃。 (见附图。) 我尝试了 SetWindowPos 和 WndProc 但类似的问题。

问题:如何使用 ResizeRedraw 和 Doublebuffering 调整无边框表单的大小而不会出现故障?

这是我的简化代码:

Public Class Form1
  Public Sub New()
      DoubleBuffered = True
      SetStyle(ControlStyles.ResizeRedraw, True)
      FormBorderStyle = FormBorderStyle.None
  End Sub
  Dim down As Boolean = False
  Dim _Right As Integer = 0
  Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseDown
      _Right = Right
      down = True
  End Sub
  Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove
      If down Then
          Dim xy As Point = PointToScreen(e.Location)
          SetBounds(xy.X - 2, Me.Top, _Right - xy.X - 2, Height)
      End If
  End Sub
End Class

Glitch anim GIF

操作系统:Windows 7

开发:VS 2015、VB、.NET 2.0

【问题讨论】:

  • 那段代码对我来说很好用,你说那是简化的......?
  • 是的,简化了,但是这个简化的代码在调整表单大小时会出现故障。但我看到这个故障都是无边界的应用程序。例如Visual Studio 2015,便签......
  • 正如我所说,我从上面照原样复制它,它工作正常。你确定你没有其他活动的东西可以在你没有向我们展示的其他方向上伸展/移动。

标签: vb.net forms winforms visual-glitch borderless


【解决方案1】:

试试这个,它是一些基于 wndproc 的 C# 代码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多