Автор: Vimil Saju

 

Чтобы добавить дополнительную кнопку, нам прийдётся создать обработчики для следующих событий:

WM_NCPAINT;//вызывается, когда перерисовывается не клиентская область формы

WM_NCACTIVATE; вызывается, когда заголовок формы становится активныи

WM_NCLBUTTONDOWN; вызывается, когда кнопка мыши нажимается на не клиентской области

WM_NCMOUSEMOVE; вызывается, когда курсор мыши передвигается по не клиентской области

WM_MOUSEMOVE;вызывается, когда курсор мыши передвигается по клиентской области

WM_LBUTTONUP; вызывается, когда кнопка мыши отпушена в клиентской области

WM_NCLBUTTONUP; вызывается, когда кнопка мыши отпушена в не клиентской области

WM_NCLBUTTONDBLCLK; вызывается при двойном щелчке мышкой в не клиентской области

Автор: Christian Cristofori

 

В примере показывается, как изменять заголовок окна (видимый в списке задач при переключении между приложениями) при минимизации окна в иконку.

 

Сперва необходимо определить сообщение поумолчанию:

Code:

Const

DefMsgNorm = 'MyApp version 1.0';

DefMsgIcon = 'MyApp. (Use F12 to turn of)';

  

Как выполнить код после создания MDIChild-формы но до появления ее на экране?
Как отобразить MDIChild-форму модально?

1.Убераешь свою MDIChild форму из автосоздания: (MainMenu) Project->Options->Forms. Там её перебрасываешь в: Available forms

 

2. Переключаешься на свою MDIChild форму и дописываеш в описание класса(пусть например твой класс формы для MDIChild называется TForm2):

 

Note: The formDeactivate never gets called so when the form isn't active, sometimes the FormPaint isn't called. If anything causes the form to be repainted while in inactive, it draws correctly.

Примечание: formDeactivate никогда не вызывается, когда форма не активна, иногда FormPaint не называется. Если что-то вызывает форму, чтобы быть перекрашены в то время как в неактивном, он правильно рисует.

Ваpиант 1. CoolBar.

Code:

procedure TMainForm.SetBands(AControls: array of TWinControl;

ABreaks: array of boolean);

var

i: integer;

begin

with CoolBar do

begin

   for i:=0 to High(AControls) do

   begin

     if Bands.Count=succ(i) then

       TCoolBand.Create(Bands);

     with Bands[succ(i)] do

     begin

       if Assigned(Control) then

         Control.Hide;

       MinHeight:=AControls[i].Height;

       Break:=ABreaks[i];

       Control:=AControls[i];

       Control.Show;

       Visible:=true;

     end

   end;

   for i:=High(AControls)+2 to pred(Bands.Count) do

     Bands[i].Free

end

end;

 

 

Создайте обработчик одного из сообщений WM_NC (non client - не клиентских) (посмотрите

WM_NC в Windows API help). Пример показывает как перехватить вижение мыши во всей

неклиенстской области окна (рамка и заголовок).

 

 

Для того чтобы сделать это выполните следующие шаги:

     Создайте новый проект.

     Установите FormStyle формы в fsMDIForm

     Разместите Image на форме и загрузите в него картинку.

     Найдите { Private Declarations } в объявлении формы и добавьте следующие строки:

 

Автор: Fernando Silva

 

Пример показывает, как при инициализации формы происходит поиск нашего окна, а затем вычисление местоположения нужной нам кнопки в заголовке окна.

Code:

procedure TForm1.FormCreate(Sender: TObject);

var

hwndHandle: THANDLE;

hMenuHandle: HMENU;

iPos: Integer;

 

begin

hwndHandle := FindWindow(nil, PChar(Caption));

if (hwndHandle <> 0) then

begin

   hMenuHandle := GetSystemMenu(hwndHandle, FALSE);

   if (hMenuHandle <> 0) then

   begin

     DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);

     iPos := GetMenuItemCount(hMenuHandle);

     Dec(iPos);

       { Надо быть уверенным, что нет ошибки т.к. -1 указывает на ошибку }

     if iPos > -1 then

       DeleteMenu(hMenuHandle, iPos, MF_BYPOSITION);

   end;

end;

end;

 

 

 

Code:

procedure TCustomForm.VisibleChanging;

begin

if (FormStyle = fsMDIChild) and Visible then

   raise EInvalidOperation.Create(SMDIChildNotVisible);

end;

 

 

 

 

Code:

{ Избавление от ScrollBar'ов в MDI-форме. (С) Peter Below (TeamB)              }

{ Не надо VCL переписывать :-)                                                 }

 

unit MainForm;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Menus;

 

type

TfMain = class(TForm)

   MainMenu1: TMainMenu;

   Newchild1: TMenuItem;

   Newchild2: TMenuItem;

   procedure Newchild2Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

private

   { Private declarations }

public

   { Public declarations }

end;

 

var

fMain: TfMain;

 

implementation

 

uses ChildForm;

 

{$R *.DFM}

 

procedure TfMain.Newchild2Click(Sender: TObject);

begin

with TfChild.Create(Application) do

   Show();

end;

 

function ClientWindowProc( wnd: HWND; msg: Cardinal; wparam, lparam: Integer ): Integer; stdcall;

var

f: Pointer;

begin

f := Pointer( GetWindowLong( wnd, GWL_USERDATA ));

case msg of

WM_NCCALCSIZE:

   if ( GetWindowLong( wnd, GWL_STYLE ) and

                      (WS_HSCROLL or WS_VSCROLL)) <> 0 then

     SetWindowLong( wnd, GWL_STYLE, GetWindowLong( wnd, GWL_STYLE )

                                  and not (WS_HSCROLL or WS_VSCROLL));

end;

Result := CallWindowProc( f, wnd, msg, wparam, lparam );

end;

 

procedure TfMain.FormCreate(Sender: TObject);

begin

if ClientHandle <> 0 then begin

   if GetWindowLong( ClientHandle, GWL_USERDATA ) <> 0 then

     Exit;  {cannot subclass client window, userdata already in use}

   SetWindowLong(ClientHandle, GWL_USERDATA, SetWindowLong( ClientHandle,

                               GWL_WNDPROC, integer( @ClientWindowProc)));

end;

 

end;

 

end.

 

 

Если в дочерней форме MDI установить BorderStyle в bsNone, то заголовок формы не исчезнет. (Об этом сказано в хелпе). А вот следующий пример решает эту проблему:

Code:

type

... = class(TForm)

{ other stuff above }

   procedure CreateParams(var Params: TCreateParams); override;

{ other stuff below }

end;

...

procedure tMdiChildForm.CreateParams(var Params: tCreateParams);

begin

inherited CreateParams(Params);

Params.Style := Params.Style and (not WS_CAPTION);

end;