Windows Forms перемещает окно без полей

#c# #winforms

#c# #winforms

Вопрос:

у меня есть приложение Windows Forms, которое должно быть без полей (даже без заголовка), с возможностью изменения размера и перемещения.

до сих пор я установил для BorderStyle значение ‘none’, которое удаляет все границы и позволяет моей программе выглядеть красиво.

Теперь я добавил невидимые границы со следующим:

     private const int cGrip = 16;      // Grip size
    private const int cCaption = 50;   // Caption bar height;

    protected override void OnPaint(PaintEventArgs e)
    {
        Rectangle rc = new Rectangle(this.ClientSize.Width - cGrip, this.ClientSize.Height - cGrip, cGrip, cGrip);
        ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, rc);
        rc = new Rectangle(0, 0, this.ClientSize.Width, cCaption);
        //e.Graphics.FillRectangle(Brushes.DarkBlue, rc);

    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x84)
        {  // Trap WM_NCHITTEST
            Point pos = new Point(m.LParam.ToInt32());
            pos = this.PointToClient(pos);
            if (pos.Y < cCaption)
            {
                m.Result = (IntPtr)2;  // HTCAPTION
                return;
            }
            if (pos.X >= this.ClientSize.Width - cGrip amp;amp; pos.Y >= this.ClientSize.Height - cGrip)
            {
                m.Result = (IntPtr)17; // HTBOTTOMRIGHT
                return;
            }
        }

        base.WndProc(ref m);
    }
 

Макет программы

Синий прямоугольник отображается с помощью метода OnPaint () и показывает поле, в котором пользователь может перемещать окно, удерживая левую кнопку мыши.

Моя проблема в том, что этот прямоугольник находится под моей меткой. Кто-нибудь знает, как получить прямоугольник перед меткой?

Другим способом было бы отключить метку, которая затем становится темно-серой. Вы бы решили мою проблему, если бы я мог изменить цвет моей отключенной метки.

Комментарии:

1. Что это BackColor за метка? Вероятно, вам следует попытаться перефразировать ваше описание проблемы. Я тоже не уверен, что понимаю

2. Выглядит знакомо, здесь требуется указание авторства. Не используйте метку, используйте TextRenderer. DrawText() в OnPaint().

3. Спасибо за ваши предложения, даже если не все понимают, что я спросил @41686d6564

Ответ №1:

Оставьте метку включенной и сделайте так, чтобы перетаскивание метки также приводило к перетаскиванию формы:

 public const int HT_CAPTION = 0x2;
public const int WM_NCLBUTTONDOWN = 0xA1;

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool ReleaseCapture();

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

private void label1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        ReleaseCapture();
        SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    }
}