Перемещение формы без полей приводит к странным побочным эффектам - PullRequest
1 голос
/ 08 октября 2019

Я довольно новичок в C #. Чтобы получить приложение современного дизайна, я решил сделать свою форму без полей. Затем я нашел фрагмент кода, позволяющий переместить мою форму без полей, которая прекрасно работает.

private const int WM_NCHITTEST = 0x84;
private const int HT_CAPTION = 0x2;

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    switch (m.Msg) {
        case WM_NCHITTEST:
            m.Result = (IntPtr)(HT_CAPTION);
            break;
    }
}

Мне также нужно извлечь событие максимизации формы, и нашел другой фрагмент кода, который снова работаетв совершенстве. По крайней мере, если я буду использовать их независимо.

                case WM_SYSCOMMAND:
                if (IsMaximized == false)
                {
                    IsMaximized = true;
                    Btn_Ribbon_MaximizeMinimize.Image = Properties.Resources.Img_MinimizeForm;
                    this.WindowState = FormWindowState.Maximized;
                }
                else if (IsMaximized == true)
                {
                    IsMaximized = false;
                    Btn_Ribbon_MaximizeMinimize.Image = Properties.Resources.Img_MaximizeForm;
                    this.WindowState = FormWindowState.Normal;
                }
                break;

Теперь вот странная часть. Если я использую их обоих вместе ...

        #region Move borderless Form
    private const int WM_NCHITTEST = 0x84;
    private const int HT_CLIENT = 0x1;
    private const int HT_CAPTION = 0x2;
    private const int WM_SYSCOMMAND = 0x0112;

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        switch (m.Msg) {
            case WM_NCHITTEST:
                m.Result = (IntPtr)(HT_CAPTION);
                break;
            case WM_SYSCOMMAND:
                if (IsMaximized == false)
                {
                    IsMaximized = true;
                    Btn_Ribbon_MaximizeMinimize.Image = Properties.Resources.Img_MinimizeForm;
                    this.WindowState = FormWindowState.Maximized;
                }
                else if (IsMaximized == true)
                {
                    IsMaximized = false;
                    Btn_Ribbon_MaximizeMinimize.Image = Properties.Resources.Img_MaximizeForm;
                    this.WindowState = FormWindowState.Normal;
                }
                break;
        }
    }
    #endregion

... Я получаю всевозможные странные побочные эффекты:

  • Достаточно одного клика на мою форму, чтобы онмаксимизировать себя
  • После минимизации моего приложения, повторный щелчок его значка на панели задач Windows не приводит к его нормализации, но максимизация

Как избавиться от этих побочных эффектов,или даже лучше, чем обходной путь, есть ли лучший способ сделать эту работу?

1 Ответ

0 голосов
/ 09 октября 2019

Сообщение WM_SYSCOMMAND может содержать информацию не только о событии максимизации. Когда вы обрабатываете WM_NCHITTEST и сообщаете ОС, что строка заголовка была нажата, она также вызывает WM_SYSCOMMAND, когда вы отпускаете кнопку мыши.

Вы должны проверить значение m.WParam, чтобы определить, какое действие было выполнено.

В документации упоминается SC_MAXIMIZE (0xF030), но на моей машинезначение на самом деле SC_MAXIMIZE2 (0xF032). Я не могу найти никаких документов об этом значении, но этот ответ также упоминает его.

...