Карта сайтаСсылкиКонтакты

Хостинг


Создание сворачивающейся формы

PDF Печать
Статьи

В этой статье описывается как создать форму, которая сворачивается рулоном по высоте до высоты заголовка.

Есть компонент для сворачивания формы, но здесь показано, как написать код в самой форме, затем можно добавить ее в 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.


 

Добавить комментарий


Защитный код
Обновить