В этой статье описывается как создать форму, которая сворачивается рулоном по высоте до высоты заголовка.
Есть компонент для сворачивания формы, но здесь показано, как написать код в самой форме, затем можно добавить ее в Object Reposutory и просто добавлять эту форму для многократного использования.
Вот этот код:
unit testmain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Printers, Buttons, ShellAPI;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FOldHeight : Integer;
procedure WMNCRButtonDown(var Msg : TWMNCRButtonDown); message WM_NCRBUTTONDOWN;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
FOldHeight := ClientHeight;
end;
procedure TForm1.WMNCRButtonDown(var Msg : TWMNCRButtonDown);
var
I : Integer;
begin
if (Msg.HitTest = HTCAPTION) then
if (ClientHeight = 0) then
begin
I := 0;
while (I < FOldHeight) do begin
I := I + 40;
if (I > FOldHeight) then
I := FOldHeight;
ClientHeight := I;
Application.ProcessMessages;
end;
end
else
begin
FOldHeight := ClientHeight;
I := ClientHeight;
while (I > 0) do begin
I := I - 40;
if (I < 0) then
I := 0;
ClientHeight := I;
Application.ProcessMessages;
end;
end;
end;
end.
Сначала в ответ на сообщение WM_NCRBUTTONDOWN и процедуру WMNCRButtonDown, обрабатывающую сообщение, указываем свернуть окно / развернуть. WM_NCRBUTTONDOWN срабатывает каждый раз, когда нажата правая кнопка в неклиентской области, меню или области заголовка формы. (Клиентская область - где происходит вся деятельность окна. Вообще, Windows API ограничивает рисование только в пределах клиентской области).
Delphi инкапсулирует WM_NCRBUTTONDOWN в типе TWMNCRButtonDown, который является фактически порождением от типа TWMNCHitMessage, который имеет следующую структуру:
type
TWMNCHitMessage = record
Msg : Cardinal;
HitTest : Integer;
XCursor : SmallInt;
YCursor : SmallInt;
Result : Longint;
end;
В таблице рассмотрены параметры структуры TWMCHitMessage более подробно:
Поля записи TWMNCHitMessage
Параметр |
Тип |
Описание |
Msg |
Cardinal |
Каждое сообщение Windows имеет целочисленное значение, которое является его назначеннымID |
HitTest |
Integer |
Это константа, которая возвращена функцией Windows, которая определяет область окна, когда было сгенерировано сообщение. Для наших целей мы будем использовать HTCAPTION. Более подробную информацию WM_NCRBUTTONDOWN для значений nHitTest можно посмотреть в справке. |
XCursor |
SmallInt |
Значение позиции X курсора относительно верхнего левого угла окна. |
YCursor |
SmallInt |
Значение позиции Y курсора относительно верхнего левого угла окна. |
Result |
LongInt |
Значение результата WM_NCRBUTTONDOWN. Должно быть 0, если приложение обработало сообщение. |
Теперь давайте рассмотрим код более подробно.
Нужно просто создать перехватчики сообщений, чтобы иметь дело с сообщениями, которые не обрабатываются объектом по умолчанию. Щелчок правой кнопкой мыши в области заголовка не обрабатывается, поэтому нужно создать для него перехватчик. Процедура procedure WMNCRButtonDown(var Msg: TWMNCRButtonDown); message WM_NCRBUTTONDOWN; это и есть перехватчик сообщения. Вот что происходит в процедуре:
Чтобы сделать это, нужно создать переменную FOldHeight и устанавливать ее значение в FormCreate всякий раз, когда форма должна быть свернута. Эта переменная нужна для того, чтобы помнить какой размер был до того, как он был изменен до 0.
|