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