Предотвращение изменения размеров формы

В некоторых случаях разработчики могут захотеть создать в Delphi форму, содержащую некоторые характеристики диалогового окна. Например, они не хотят позволить конечным пользователям изменять размеры формы в режиме выполнения программы также, как это может программист во вромя разработки. В Delphi не существует свойств или методов для создания формы с такими характеристиками. Но из-за наличия разработанного программного слоя между Delphi и API, программисты могут справиться с этой задачей довольно легко.

Следующий пример демонстрирует способ обработки системного сообщения "WM_GetMinMaxInfo", которое позволяет разработчикам ограничивать в режиме выполнения программы размер окна (формы) определенным значением. В этом случае сообщение будет использоваться, чтобы функционально запретить возможность изменения размера окна.

Используйте следующий модуль:

unit getminmax;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)

private
{ Private declarations }
procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
message WM_GETMINMAXINFO;
procedure WMInitMenuPopup(var Msg: TWMInitMenuPopup);
message WM_INITMENUPOPUP;
procedure WMNCHitTest(var Msg: TWMNCHitTest);
message WM_NCHitTest;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
begin
inherited;
with Msg.MinMaxInfo^ do
begin
ptMinTrackSize.x:= form1.width;
ptMaxTrackSize.x:= form1.width;
ptMinTrackSize.y:= form1.height;
ptMaxTrackSize.y:= form1.height;
end;
end;

procedure TForm1.WMInitMenuPopup(var Msg: TWMInitMenuPopup);
begin
inherited;
if Msg.SystemMenu then
EnableMenuItem(Msg.MenuPopup, SC_SIZE, MF_BYCOMMAND or MF_GRAYED)
end;

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
inherited;
with Msg do
if Result in [HTLEFT, HTRIGHT, HTBOTTOM, HTBOTTOMRIGHT,
HTBOTTOMLEFT, HTTOP, HTTOPRIGHT, HTTOPLEFT] then

Result:= HTNOWHERE
end;
end.  { Конец модуля}

Обработчик системного сообщения "WM_GetMinMaxInfo" в вышеприведенном коде использовался для установления минимального и максимального значения окна TrackSize, где этому значению были присвоены величины, задаваемые в период проектирования формы. На самом деле этого достаточно, чтобы форма не меняла размеров, но мы для примера добавили обработку еще двух сообщений, чтобы ваше приложение выглядело профессионально. Первым сообщением, обрабатываемым нами, было сообщение "WMInitMenuPopup", оно позволяло сделать недоступным пункт системного меню, касающегося возможности изменения размеров окна. Вторым сообщением было "WMNCHitTest", которое служило тем же целям - не создавать впечатления возможности изменения размера, а именно: запрет изменения вида курсора в момент нахождения его на границах окна.

Дополнение 

По-моему, более целесообразно переписать само свойство окна, чем обработчик события WMNCHitTest- заодно и системное меню переписывается:

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited
CreateParams(Params);
Params.Style:=Params.Style xor WS_SIZEBOX xor WS_MAXIMIZEBOX;
end;

 
« Предыдущая статья   Следующая статья »