2

我将 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); 
  }

任何帮助将不胜感激。

4

3 回答 3

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] 上,因此即使您在客户区单击并拖动它,您也可以移动您的表单。

于 2010-10-25T09:38:00.983 回答
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;
        }
于 2012-01-13T09:36:02.690 回答
0

由于似乎没有更多信息可用,我将按照建议保留边框,设置为 FixedDialog 并将 ControlBox 属性设置为 false 并清除表单的 Text。我更喜欢另一种颜色的边框和移动窗口的能力。无论如何,非常感谢您的回答。

于 2010-10-26T13:23:01.453 回答