Идёт загрузка страницы...

htp://aptem.net.ru





/|\АРТЕМ.NET.RU /|\ - Портал для программистов и не только: Delphi Visual Basic BORLAND С++ PERL PHP HTML

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