Компонент TMinMax
Компонент TMinMax может быть размещен на форме для управления ее сообщением WM_GETMINMAXINFO. Вы можете устанавливать максимально/минимальный размер рамки при изменении размера формы, максимальный размер и положение окна через соответствующие свойства. Поскольку компонент управляет событием WM_GETMINMAXINFO своего владельца, вы можете разместить его на необходимом количестве форм, и управлять соответствующей формой через ее собственное событие WM_GETMINMAXINFO.
{***************************************************************************** }
{ UMINMAX.PAS }
{ Автор }
{ Robert Wittig }
{ 76401,242 }
{ Данный модуль обеспечивает вас интерфейсом для управления сообщением WM_GETMINMAXINFO }
{ на основе компонента . C помощью этого компонента вы легко можете управлять }
{ минимальным и максимальным размером окна. Вы можете также управлять размером и }
{ положением максимально раскрытого окна. }
{ Данный модуль свободен в использовании. Вы можете без ограничений использовать его }
{ в некоммерческих приложениях. Вы можете использовать его в коммерческих приложениях, }
{ если данный код занимает менее 20% от всего кода приложения. Вы можете свободно }
{ копировать и распространять данный модуль с условием сохранения (по возможности) }
{ данной информации. }
{ Пожалуйста посылайте свои коментарии/предложения автору непосредственно в форум }
{ или по e-mail по адресу 76401,242. Автор не дает никаких гарантий по работе }
{ данного модуля. }
{ История модуля }
{ ------------ }
{ 03-05-96 Автор Robert Wittig (CompuServe ID 74601,242) }
{***************************************************************************** }
unit uMinMax;
interface
Uses Classes, Controls, Forms, Messages, SysUtils, WinProcs, WinTypes;
Type
TMinMax = Class ( TComponent )
Private
OldWndProc : Pointer;
FInstance : Pointer;
MinMaxInfo : TMinMaxInfo;
FActive : Boolean;
Protected
Procedure Notification ( aComponent: TComponent; Operation: TOperation ); override;
Procedure ResetSubclass; virtual;
Procedure Subclass; virtual;
Procedure InitMinMaxInfo; virtual;
Procedure MinMaxWndProc ( Var Message : TMessage ); virtual;
Function GetMinWidth : Integer; virtual;
Function GetMinHeight : Integer; virtual;
Function GetMaxWidth : Integer; virtual;
Function GetMaxHeight : Integer; virtual;
Function GetMaximizedX : Integer; virtual;
Function GetMaximizedY : Integer; virtual;
Function GetMaximizedWidth : Integer; virtual;
Function GetMaximizedHeight : Integer; virtual;
Function GetReset : Boolean; virtual;
Procedure SetActive ( Value : Boolean ); virtual;
Procedure SetMinWidth ( Value : Integer ); virtual;
Procedure SetMinHeight ( Value : Integer ); virtual;
Procedure SetMaxWidthWM_GETMINMAXINFO ( Value : Integer ); virtual;
Procedure SetMaxHeight ( Value : Integer ); virtual;
Procedure SetMaximizedX ( Value : Integer ); virtual;
Procedure SetMaximizedY ( Value : Integer ); virtual;
Procedure SetMaximizedWidth ( Value : Integer ); virtual;
Procedure SetMaximizedHeight ( Value : Integer ); virtual;
Procedure SetReset ( Value : Boolean ); virtual;
Procedure SetNewSize; virtual;
Public
Destructor Destroy; override;
Published
Property Active : Boolean Read FActive Write SetActive;
Property MinWidth : Integer Read GetMinWidth Write SetMinWidth;
Property MinHeight : Integer Read GetMinHeight Write SetMinHeight;
Property MaxWidth : Integer Read GetMaxWidth Write SetMaxWidth;
Property MaxHeight : Integer Read GetMaxHeight Write SetMaxHeight;
Property MaximizedX : Integer Read GetMaximizedX Write SetMaximizedX;
Property MaximizedY : Integer Read GetMaximizedY Write SetMaximizedY;
Property MaximizedWidth : Integer Read GetMaximizedWidth Write
SetMaximizedWidth;Property MaximizedHeight : Integer Read GetMaximizedHeight Write
SetMaximizedHeight;{**************************** RCW 03-05-96 ************************}
{ Reset является псевдо-свойством. Если значение равно True, TMinMax сбрасывает }
{ свойства Min/Max и устанавливает значения по умолчанию. }
{**************************** RCW 03-05-96 ************************}
Property Reset : Boolean Read GetReset Write SetReset;
End;
{********************************** RCW 03-05-96 ******************************}
{ Использование: Общая информация относительно WM_GETMINMAXINFO содержится }
{ в статьях WM_GETMINMAXINFO и TMINMAXINFO в файле справке }
{ по функциям API. Также, имейте в виду следующее: }
{ 1) При перемещении границ окна минимальные/максимальные }
{ размеры окна определяются свойствами MinWidth, MaxWidth,}
{ MinHeight и MaxHeight. }
{ 2) При максимизации окна максимальная высота и ширина }
{ окна определяются соответственно Min(MaxHeight, }
{ MaximizedHeight) и Min(MaxWidth,MaximizedWidth). Это }
{ функция Windows и не зависит от работы компонента. }
{ ( Примечание: возможно иметь окно, которое }
{ имеет рамку большего размера чем максимальный }
{ размер окна. ) }
{ 3) Будьте осторожными при установке MaximizedX и MaximizedY. }
{ Примечание: если вы установили это слишком маленьким }
{ или слишком большим, ни кнопка, ни заголовок (для двойного }
{ щелчка) видимыми не будут. Следовательно, вы не можете }
{ восстановить окно до нормального состояния через нормальный }
{ интерфейс Windows. }
{********************************** RCW 03-05-96 ******************************}
Procedure Register;
implementation
Procedure Register;
Begin
RegisterComponents ( 'Custom', [TMinMax] );
End;
Destructor TMinMax.Destroy;
Begin
If FInstance <> Nil
Then FreeObjectInstance ( FInstance );
Inherited Destroy;
End;
Procedure TMinMax.Notification ( aComponent: TComponent; Operation: TOperation );
Begin
If aComponent = Self
Then If Operation = opInsert
Then Subclass
Else If Operation = opRemove
Then ResetSubclass;
Inherited Notification ( aComponent, Operation );
End;
Procedure TMinMax.ResetSubclass;
Begin
If ( FInstance <> Nil ) And
( Owner <> Nil )
Then If IsWindow ( TWinControl(Owner).Handle )
Then SetWindowLong ( TWinControl(Owner).Handle, GWL_WNDPROC,
LongInt ( OldWndProc ) );End;
Procedure TMinMax.Subclass;
Begin
If Owner Is TWinControl
Then With TWinControl(Owner) Do
Begin
If FInstance = Nil
Then FInstance := MakeObjectInstance ( MinMaxWndProc );
OldWndProc := Pointer ( GetWindowLong ( Handle, GWL_WNDPROC ) );
SetWindowLong ( Handle, GWL_WNDPROC, LongInt ( FInstance ) );
InitMinMaxInfo;
End;
End;
Procedure TMinMax.InitMinMaxInfo;
Begin
With MinMaxInfo Do
Begin
If Owner Is TForm
Then With ptMaxPosition Do
Case TForm(Owner).BorderStyle Of
bsSingle : Begin
X := -GetSystemMetrics ( SM_CXBORDER );
Y := -GetSystemMetrics ( SM_CYBORDER );
End;
bsSizeable : Begin
X := -GetSystemMetrics ( SM_CXFRAME );
Y := -GetSystemMetrics ( SM_CYFRAME );
End;
End;
With ptMaxSize Do
Begin
X := Screen.Width - 2 * ptMaxPosition.X;
Y := Screen.Height - 2 * ptMaxPosition.Y;
End;
ptMaxTrackSize := ptMaxSize;
End;
End;
Procedure TMinMax.MinMaxWndProc ( Var Message : TMessage );
Begin
Message.Result := CallWindowProc ( TFarProc(OldWndProc), TWinControl(Owner).Handle,
Message.Msg, Message.wParam, Message.lParam );If FActive And ( Message.Msg = WM_GETMINMAXINFO )
Then PMinMaxInfo ( Message.lParam )^ := MinMaxInfo;
End;
Function TMinMax.GetMinWidth : Integer;
Begin
Result := MinMaxInfo.ptMinTrackSize.X;
End;
Function TMinMax.GetMinHeight : Integer;
Begin
Result := MinMaxInfo.ptMinTrackSize.Y;
End;
Function TMinMax.GetMaxWidth : Integer;
Begin
Result := MinMaxInfo.ptMaxTrackSize.X;
End;
Function TMinMax.GetMaxHeight : Integer;
Begin
Result := MinMaxInfo.ptMaxTrackSize.Y;
End;
Function TMinMax.GetMaximizedX : Integer;
Begin
Result := MinMaxInfo.ptMaxPosition.X;
End;
Function TMinMax.GetMaximizedY : Integer;
Begin
Result := MinMaxInfo.ptMaxPosition.Y;
End;
Function TMinMax.GetMaximizedWidth : Integer;
Begin
Result := MinMaxInfo.ptMaxSize.X;
End;
Function TMinMax.GetMaximizedHeight : Integer;
Begin
Result := MinMaxInfo.ptMaxSize.Y;
End;
Function TMinMax.GetReset : Boolean;
Begin
Result := False;
End;
Procedure TMinMax.SetActive ( Value : Boolean );
Begin
If Value <> FActive
Then Begin
FActive := Value;
SetNewSize;
End;
End;
Procedure TMinMax.SetMinWidth ( Value : Integer );
Begin
If Value < 0
Then Value := 0;
If Value <> MinMaxInfo.ptMinTrackSize.X
Then Begin
MinMaxInfo.ptMinTrackSize.X := Value;
SetNewSize;
End;
End;
Procedure TMinMax.SetMinHeight ( Value : Integer );
Begin
If Value < 0
Then Value := 0;
If Value <> MinMaxInfo.ptMinTrackSize.Y
Then Begin
MinMaxInfo.ptMinTrackSize.Y := Value;
SetNewSize;
End;
End;
Procedure TMinMax.SetMaxWidth ( Value : Integer );
Begin
If Value < MinMaxInfo.ptMinTrackSize.X
Then Value := MinMaxInfo.ptMinTrackSize.X;
If Value <> MinMaxInfo.ptMaxTrackSize.X
Then Begin
MinMaxInfo.ptMaxTrackSize.X := Value;
SetNewSize;
End;
End;
Procedure TMinMax.SetMaxHeight ( Value : Integer );
Begin
If Value < MinMaxInfo.ptMinTrackSize.Y
Then Value := MinMaxInfo.ptMinTrackSize.Y;
If Value <> MinMaxInfo.ptMaxTrackSize.Y
Then Begin
MinMaxInfo.ptMaxTrackSize.Y := Value;
SetNewSize;
End;
End;
Procedure TMinMax.SetMaximizedX ( Value : Integer );
Begin
MinMaxInfo.ptMaxPosition.X := Value;
End;
Procedure TMinMax.SetMaximizedY ( Value : Integer );
Begin
MinMaxInfo.ptMaxPosition.Y := Value;
End;
Procedure TMinMax.SetMaximizedWidth ( Value : Integer );
Begin
MinMaxInfo.ptMaxSize.X := Value;
End;
Procedure TMinMax.SetMaximizedHeight ( Value : Integer );
Begin
MinMaxInfo.ptMaxSize.Y := Value;
End;
Procedure TMinMax.SetReset ( Value : Boolean );
Begin
If Value
Then InitMinMaxInfo;
End;
Procedure TMinMax.SetNewSize;
Begin
If Not FActive
Then Exit;
{**************************** RCW 03-05-96 ******************************}
{ Если размер окна превышает допустимые пределы, производим необходимую коррекцию. }
{****************************** RCW 03-05-96 ****************************}
If FInstance = Nil
Then Raise Exception.Create ( 'Не могу управлять WM_GETMINMAXINFO, поскольку
Owner не TWinControl' )Else With TWinControl(Owner), MinMaxInfo Do
Begin
If ( ptMinTrackSize.X <> 0 ) Or
( ptMaxTrackSize.X <> 0 )
Then If Width < ptMinTrackSize.X
Then Width := ptMinTrackSize.X
Else If Width > ptMaxTrackSize.X
Then Width := ptMaxTrackSize.X;
If ( ptMinTrackSize.Y <> 0 ) Or
( ptMaxTrackSize.Y <> 0 )
Then If Height < ptMinTrackSize.Y
Then Height := ptMinTrackSize.Y
Else If Height > ptMaxTrackSize.Y
Then Height := ptMaxTrackSize.Y;
End;
End;
end.
|
- Robert Wittig [000925]