Отключить восстановление формы по двойному щелчку заголовка

  1. Создайте пустой проект Delphi VCL.
  2. Удалить все BorderIcons основной формы
  3. Установите для WindowState значение wsMaximized.
  4. Запустить приложение. Главное окно отображается развернутым.
  5. Дважды щелкните заголовок окна. Главное окно восстанавливает свой размер, и нет возможности снова развернуть его.

Как предотвратить восстановление окна при двойном щелчке заголовка, не скрывая строку заголовка?


person Paul    schedule 30.11.2018    source источник
comment
Оставив biMaximize TRUE, пользователь может дважды щелкнуть заголовок окна в обоих направлениях (также снова развернуть его) без отображения системных значков. Почему бы просто не оставить это и вместо этого принудительно создать кривое окно, у которого все еще будут проблемы при изменении разрешения рабочего стола?   -  person AmigoJack    schedule 08.12.2018
comment
В моем комментарии показан подход только с преимуществами и даже указано, почему у вашего все еще есть недостатки - вы его пробовали?   -  person AmigoJack    schedule 08.12.2018
comment
AmigoJack: Решение от Sertac Akyuz на 100% удовлетворяет мои потребности и потребности моего заказчика. Вместе с настройкой этого приложения в качестве оболочки это работает очень хорошо.   -  person Paul    schedule 08.12.2018
comment
Это детали, которые нигде не упоминаются, даже в вопросе, поэтому я представил себе окно плюс панели задач и / или несколько мониторов.   -  person AmigoJack    schedule 08.12.2018


Ответы (3)


Вы можете перехватить восстановление и, кроме того, системные команды перемещения, чтобы предотвратить восстановление, перетащив заголовок.

type
  TForm1 = class(TForm)
  protected
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;

...

procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
  case Message.CmdType and $FFF0 of
    SC_MOVE, SC_RESTORE: Exit;
  end; 
  inherited;
end;
person Sertac Akyuz    schedule 30.11.2018

Ответ отредактирован!

Если я вас правильно понял, вы можете запретить двойной щелчок по строке заголовка, чтобы предотвратить восстановление исходного размера формы. Вы можете сделать это, перехватив WM_NCLBUTTONDBLCLK.

В приведенном ниже примере я переопределил метод WndProc основной формы и перехватил вышеупомянутое сообщение.

procedure TForm1.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_NCLBUTTONDBLCLK:
      begin
        case TWMNCHitMessage(Message).HitTest of
          HTCAPTION:
            Exit
        else  // Another HitTest-codes are handled here
          Inherited WndProc(Message);
        end;
      end
  else
    Inherited WndProc(Message);
  end;
end;

Важное примечание

Хотя теперь вы не можете восстановить развернутую форму двойным щелчком, ее все еще можно восстановить, просто переместив ее, когда мышь захватывается строкой заголовка. По крайней мере, в Windows 7 этот эффект присутствует.
Шаги для воспроизведения:

  • Запустить приложение;
  • Нажмите левую кнопку мыши, когда она наведена на строку заголовка;
  • Не отпускайте ЛКМ и плавно двигайте мышью - теперь форма восстанавливает свой размер.

Дополнение

Исправлена ​​ошибка с некорректной обработкой других неклиентских HitTest-кодов, кроме HTCAPTION (спасибо пользователю Dsm за указание на это!).

person Josef Švejk    schedule 30.11.2018
comment
Если вы переместите форму, как описано, вы все равно не сможете развернуть форму, как я вижу в Windows 10. - person Dsm; 30.11.2018
comment
Извини, @dima, ты прав. Я удалю свои комментарии и решение. Я все еще думаю, что ваше решение выглядит неправильным, поскольку, если срабатывает событие WM_NCLBUTTONDBLCLICK, оно не обрабатывается независимо от того, находится ли HitTest в области заголовка. Если вы проследите с помощью отладчика, вы поймете, что я имею в виду. Тем не менее, OnDbleClick возникает в сообщении WM_MOUSEDOWN, а не в этом, поэтому на практике это не имеет большого значения. - person Dsm; 30.11.2018
comment
@Dsm, я понимаю, что ты имел в виду. Я изменил свой ответ. Теперь корректно обрабатывает все остальные HitTest-коды. - person Josef Švejk; 30.11.2018
comment
Спасибо за ваши усилия! Я не думал о том, чтобы перетащить заголовок. Кажется, я буду использовать Form's Constraints. - person Paul; 01.12.2018
comment
@Paul, метод в моем ответе предотвращает оба способа восстановления. - person Sertac Akyuz; 01.12.2018

Я протестировал несколько решений, и одно из них сработало:

  1. Задайте для свойства Align значение alClient;
  2. Удалить biMaximize из свойства BorderIcons;
  3. Пусть WindowState wsNormal (по умолчанию).
person Guilherme Roberge Daleffe    schedule 22.08.2020