winforms绘制边框并在FormBorderStyle设置为None时移动

时间:2010-10-25 09:20:47

标签: c# winforms border move

我将winform显示为对话框(在主窗口上显示ShowDialog)。 所以,我将FormBorderStyle设置为None,因为我既不想要控件盒也不想要标题栏。 虽然,我想画一个边框(例如像普通窗户一样的蓝色边框)并保持移动表格的能力。 我不需要调整它的大小。 我试图通过覆盖OnPaint来绘制边框,但它永远不会被调用。 这是我的代码:

  protected override void OnPaint (PaintEventArgs e)
  {
    base.OnPaint (e);
    int borderWidth = 2;
    Color borderColor = Color.Blue;
    ControlPaint.DrawBorder (e.Graphics, e.ClipRectangle, borderColor,
      borderWidth, ButtonBorderStyle.Solid, borderColor, borderWidth,
      ButtonBorderStyle.Solid, borderColor, borderWidth, ButtonBorderStyle.Solid,
      borderColor, borderWidth, ButtonBorderStyle.Solid); 
  }

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

Paint方法在这里是错误的,因为它不会绘制表单的所谓非客户区域,例如边框和标题栏。

要隐藏标题栏,您需要将ControlBox属性设置为false并清除表单的Text属性。将边框设置为FixedDialog以使表单无法显示。

要保留在没有标题栏的情况下移动表单的功能,您需要覆盖WndProc

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
      case 0x84: m.Result = new IntPtr(0x2);
          return;
    }
    base.WndProc(ref m);
}

基本上这是处理WM_NCHITTEST消息和作弊的标准方式,说 - 鼠标光标位于窗口的标题[返回值0x2]上,因此即使您单击,也可以移动表单客户区并拖动它。

答案 1 :(得分:1)

我的问题是要有一个带有细边框的可调整大小的表单。

我将FormBorderStyle设置为None

我使用包含所有控件的停靠面板。

我使用面板填充来设置边框宽度。

然后:

Point ResizeLocation = Point.Empty;
        void panResize_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left) {
                ResizeLocation = e.Location;
                ResizeLocation.Offset(-panResize.Width, -panResize.Height);
                if (!(ResizeLocation.X > -16 || ResizeLocation.Y > -16))
                    ResizeLocation = Point.Empty;
            }
            else
                ResizeLocation = Point.Empty;
        }
        void panResize_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && !ResizeLocation.IsEmpty) {
                if (panResize.Cursor == Cursors.SizeNWSE)
                    Size = new Size(e.Location.X - ResizeLocation.X, e.Location.Y - ResizeLocation.Y);
                else if (panResize.Cursor == Cursors.SizeWE)
                    Size = new Size(e.Location.X - ResizeLocation.X, Size.Height);
                else if (panResize.Cursor == Cursors.SizeNS)
                    Size = new Size(Size.Width, e.Location.Y - ResizeLocation.Y);
            }
            else if (e.X - panResize.Width > -16 && e.Y - panResize.Height > -16)
                panResize.Cursor = Cursors.SizeNWSE;
            else if (e.X - panResize.Width > -16)
                panResize.Cursor = Cursors.SizeWE;
            else if (e.Y - panResize.Height > -16)
                panResize.Cursor = Cursors.SizeNS;
            else {
                panResize.Cursor = Cursors.Default;
            }

        }

        void panResize_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            ResizeLocation = Point.Empty;
        }

答案 2 :(得分:0)

由于没有更多信息可用,我将按照建议离开边框,设置为FixedDialog,并将ControlBox属性设置为false并清除表单的文本。 我更喜欢边框的另一种颜色和移动窗户的能力。 无论如何,非常感谢你的答案。