Отключите изменение размеров формы в Дельфи

Там какой-либо путь состоит в том, чтобы остановить пользователя, изменяющего размер формы?

В настоящее время я использую:

Когда измененный размер формы....

MainForm.Height := 761;
MainForm.Width := 777;

Но это выглядит ужасным, поскольку это мерцает, поскольку пользователь пытается изменить размер формы.

19
задан chendriksen 29 March 2010 в 14:15
поделиться

2 ответа

Установить размер легко, у вас есть два варианта:

  1. Формы Delphi имеют свойство BorderStyle и свойство BorderIcons . Если вы установите BorderStyle на bsDialog , а BorderIcons только на biSystemMenu ], пользователь не сможет изменить размер формы.

  2. Вы можете указать значение для свойства Ограничения . Если вы напишете одно и то же число в MinWidth и MaxWidth , ширина будет фиксированной.

Предотвратить ход сложнее. Сейчас я могу предложить только следующие решения:

  1. Установить BorderStyle на bsNone . При необходимости вам нужно будет нарисовать подпись формы самостоятельно.

  2. Напишите обработчик сообщений в WM_NCHITTEST , вызовите сначала унаследованный, затем проверьте Message.Result для HTCAPTION . Если это HTCAPTION , установите вместо него HTCLIENT . Таким образом, вы обманываете Windows, думая, что пользователь не нажимал на заголовок, поэтому он не сможет перетащить. Пожалуйста, попробуйте, может ли пользователь по-прежнему перемещать окно, открывая системное меню и выбирая «Переместить». В таком случае вам также необходимо скрыть системное меню ( BorderIcons ).

Ответ найден здесь .

39
ответ дан 30 November 2019 в 02:41
поделиться

Если вы хотите, чтобы ваша форма вообще не изменяла размер, тогда установка стиля границы формы на bsSingle - правильное решение, так как в этом случае курсор мыши не изменится на один из курсоров изменения размера при перемещении над границами формы, поэтому пользователю очевидно, что размер этой формы нельзя изменить.

Если вы хотите установить минимальный и / или максимальный размер для формы, тогда bsSizeable - правильный стиль границы, и вы можете использовать Ограничения формы, чтобы указать пределы. Однако существует проблема, заключающаяся в том, что свойство Constraints не препятствует изменению размера формы, а только заставляет размеры корректироваться постфактум, чтобы ограничения не нарушались. Это будет иметь негативный побочный эффект: изменение размера формы с левой или верхней границей приведет к ее перемещению. Чтобы этого не произошло, вам нужно в первую очередь предотвратить изменение размера. Windows отправляет сообщение WM_GETMINMAXINFO для получения минимального и максимального размеров отслеживания для окна верхнего уровня. Обработка этого и возврат правильных ограничений устраняет проблему с подвижной формой:

type
  TForm1 = class(TForm)
  private
    procedure WMGetMinMaxInfo(var AMsg: TWMGetMinMaxInfo);
      message WM_GETMINMAXINFO;
  end;

// ...

procedure TForm1.WMGetMinMaxInfo(var AMsg: TWMGetMinMaxInfo);
begin
  inherited;
  with AMsg.MinMaxInfo^ do begin
    ptMinTrackSize := Point(Constraints.MinWidth, Constraints.MinHeight);
    ptMaxTrackSize := Point(Constraints.MaxWidth, Constraints.MaxHeight);
  end;
end;
9
ответ дан 30 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: