Советы по Delphi

         

Компонент 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]



Содержание раздела