winforms рисуют границу и перемещаются, когда FormBorderStyle имеет значение None - PullRequest
2 голосов
/ 25 октября 2010

Я отображаю 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 ]

2 голосов
/ 25 октября 2010

Метод 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 голос
/ 13 января 2012

У меня была проблема с изменяемым размером формы с тонкой рамкой.

Я установил FormBorderStyle на Нет

Я использую закрепленную панель, которая содержит все мои элементы управления.

Я использую отступы панели, чтобы установить ширину границ.

А потом:

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;
        }
0 голосов
/ 26 октября 2010

Поскольку больше информации, по-видимому, нет, я оставлю границу в соответствии с предложением, установив значение FixedDialog со свойством ControlBox, установленным в false, и очистив текст формы.Я бы предпочел другой цвет для границы и возможность перемещения окна, хотя.В любом случае, большое спасибо за ответы.

...