Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 11

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

   SetWindowLong(FHandle, GWL_ID, FHandle);

  end;

  StrDispose(FText);

  FText := nil;

  UpdateBounds;

 Perform(WM_SETFONT, FFont.Handle, 1);

 if AutoSize then AdjustSize;

end;

БобствСнно созданиС ΠΎΠΊΠ½Π° ΠΎΠΏΡΡ‚ΡŒ происходит Π½Π΅ здСсь, Π° Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ CreateWindowHandle, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‡Π΅Π½ΡŒ прост: ΠΎΠ½ состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π·ΠΎΠ²Π° API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateWindowEx с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… бСрутся ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ записи Params Ρ‚ΠΈΠΏΠ° TCreateParams (листинг 1.10)

Листинг 1.10. Π—Π°ΠΏΠΈΡΡŒ TCreateParams

TCreateParams = record

 Caption: PChar;

 Style: WORD;

 ExStyle: DWORD;

 X, Y: Integer;

 Width, Height: Integer;

 WndParent: HWnd;

 Param: Pointer;

 WindowClass: TWndClass;

 WinClassName: array[0..63] of Char;

end;

Π’ записи Params хранятся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠ°ΠΊ ΠΎΠΊΠ½Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WindowCreateEx, Ρ‚Π°ΠΊ ΠΈ ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ класса (поля WindowClass ΠΈ WndClassName). ВсС поля ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ CreateParams Π½Π° основС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ свойств ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ Π² наслСдниках, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΡ‚ΠΈΠ»ΡŒ создаваСмого ΠΎΠΊΠ½Π°. НапримСр, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ WS_EX_CLIENTEDGE (ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, WS_EX_STATICEDGE), ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ с Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ€Π°ΠΌΠΊΠΎΠΉ (листинг 1.11).

Листинг 1.11. ΠŸΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° CreateParams

procedure TForm1.CreateParams(var Params: TCreateParams);

begin

 // Π’Ρ‹Π·ΠΎΠ² унаслСдованного ΠΌΠ΅Ρ‚ΠΎΠ΄Π° заполнСния всСх ΠΏΠΎΠ»Π΅ΠΉ

 // записи Params

 inherited CreateParams(Params);

 // ДобавляСм Ρ„Π»Π°Π³ WS_EX_CLIENTEEDGE ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΌΡƒ ΡΡ‚ΠΈΠ»ΡŽ ΠΎΠΊΠ½Π°

 Params.ExStyle := Params.ExStyle or WS_EX_CLIENTEDGE;

end;

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ Ρ€Π°Π·Π΄. 1.1.4 ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ имя ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ VCL создаСт для ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ класса этого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ имя ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ, для этого достаточно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля Params.WinClassName.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ всСм Π±Π΅Π· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ классам ΠΌΠ΅Ρ‚ΠΎΠ΄ CreateWnd Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ β€” InitWndProc. Π­Ρ‚ΠΎ являСтся основой Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сообщСний с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ VCL, ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому оконная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° назначаСтся Π½Π΅ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ CreateParams, Π° Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ CreateWnd, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² наслСдниках нСльзя Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (ΠΌΠ΅Ρ‚ΠΎΠ΄ CreateWnd Ρ‚ΠΎΠΆΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ, Π½ΠΎ ΠΏΡ€ΠΈ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ дСйствия, Π° Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ унаслСдованного ΠΌΠ΅Ρ‚ΠΎΠ΄Π°).

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° InitWndProc, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° CreateWnd: ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ CreateWindowHandle (Ρ‚.Π΅. нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ созданиСм ΠΎΠΊΠ½Π°) ΠΎΠ½ записываСт ссылку Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π‘reationΠ‘ontrol. Π­Ρ‚Π° пСрСмСнная Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ InitWndProc (листинг 1.12).

Листинг 1.12. Оконная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° InitWndProc

function InitWndProc(HWindow: HWnd; Message, WParam, LParam: LongInt): LongInt;

begin

 CreationControl.FHandle := HWindow;

 SetWindowLong (HWindow, GWL_WNDPROC, LongInt(CreationControl.FObjectInstance));

 if (GetWindowLong(HWindow, GWL_STYLE) and WS_CHILD <> 0) and (GetWindowLong(HWindow, GWL_ID) = 0) then

  SetWindowLong(HWindow, GWL_ID, HWindow);

 SetProp(HWindow, MakeIntAtom(ControlAtom), THandle(CreationControl));

 SetProp(HWindow, MakeIntAtom(WindowAtom), THandle(CreationControl));

 asm

  PUSH LParam

  PUSH WParam

  PUSH Message

  PUSH HWindow

  MOV EAX, CreationControl

  MOV CreationControl, 0

  CALL [EAX].TWinControl.FObjectInstance

  MOV Result, EAX

 end;

end;

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Код Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ InitWndProc Π² листингС 1.12 взят ΠΈΠ· Delphi 7. Π’ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях ΠΊΠΎΠ΄ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΎΠΊΠΎΠ½, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Unicode, поэтому Ρ‚Π°ΠΌ прСдусмотрСн Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ ANSI- ΠΈ Unicode-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ API (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ANSI- ΠΈ Unicode-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… см Ρ€Π°Π·Π΄. 1.1.12). Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ слоТнСС ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈΠ·-Π·Π° этих Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΈΠ· листинга 1.12 ΡƒΠ±Ρ€Π°Π½ΠΎ всС, Ρ‡Ρ‚ΠΎ относится ΠΊ компиляции ΠΏΠΎΠ΄ LINUX, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°ΡΠΎΡ€ΡΡ‚ΡŒ листинг.

Из листинга 1.12 Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ оконная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° InitWndProc Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сама Π½ΠΈΠΊΠ°ΠΊΠΈΡ… сообщСний, Π° просто ΠΏΠ΅Ρ€Π΅Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Ρƒ ΠΎΠΊΠ½Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, InitWndProc для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ InitWndProc, Ρ‚ΠΎΠΆΠ΅ пСрСдаСтся Π² эту Π½ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ (ассСмблСрная вставка Π² ΠΊΠΎΠ½Ρ†Π΅ InitWndProc Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ это). ΠŸΡ€ΠΈ просмотрС этого ΠΊΠΎΠ΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π΄Π²Π° вопроса. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ β€” Π·Π°Ρ‡Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ? Π—Π΄Π΅ΡΡŒ всС Π΄Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ. Ρ‡Ρ‚ΠΎ стандартными срСдствами оконная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° назначаСтся ΠΎΠ΄Π½Π° Π½Π° вСсь ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΉ класс, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΏΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π»ΠΎΠ³ΠΈΠΊΠ΅ VCL ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ экзСмпляр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ. Π”ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этого ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ подкласса ΡƒΠΆΠ΅ послС создания ΠΎΠΊΠ½Π°. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° свою ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ (ΠΎΡ‚ΠΊΡƒΠ΄Π° эта ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° бСрСтся ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ, ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅) ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ экзСмпляр Ρ…Ρ€Π°Π½ΠΈΡ‚ Π² ΠΏΠΎΠ»Π΅ FObjectInstance. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ CreationControl присваиваСтся, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΌΠ½ΠΈΠΌ, нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ созданиСм ΠΎΠΊΠ½Π°, Π° ΠΏΠ΅Ρ€Π²ΠΎΠ΅ своС сообщСниС ΠΎΠΊΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания. Π’Π°ΠΊ ΠΊΠ°ΠΊ VCL β€” ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ однонитСвая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ситуация, ΠΊΠΎΠ³Π΄Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ΄ вклиниваСтся ΠΌΠ΅ΠΆΠ΄Ρƒ присваиваниСм значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ CreationControl ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ InitWndProc, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² InitWndProc ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ ссылка Π½Π° создаваСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ вопрос β€” Π·Π°Ρ‡Π΅ΠΌ Ρ‚Π°ΠΊ слоТно? ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ CreateWnd сразу послС создания ΠΎΠΊΠ½Π° нСльзя Π±Ρ‹Π»ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ SetWindowLong ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Ρ‚Π°ΠΌ, вмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ€ΡƒΡ‡Π°Ρ‚ΡŒ это ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ InitWndProc? Π—Π΄Π΅ΡΡŒ ΠΎΡ‚Π²Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ: это сдСлано ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ свои ΠΏΠ΅Ρ€Π²Ρ‹Π΅ нСсколько сообщСний (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сообщСния WM_CREATE ΠΈ WM_NCCREATE) ΠΎΠΊΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ функция CreateWindowEx Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ созданиС ΠΎΠΊΠ½Π°, CreateWindowEx отправляСт нСсколько сообщСний ΠΎΠΊΠ½Ρƒ, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΎΠΊΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, процСсс создания ΠΎΠΊΠ½Π° считаСтся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΌ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ CreateWindowEx β€” это слишком ΠΏΠΎΠ·Π΄Π½ΠΎ. ИмСнно поэтому ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ оконная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° назначаСтся Ρ‚Π°ΠΊΠΈΠΌ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΈ нСсколько Π½Π΅ΡƒΠΊΠ»ΡŽΠΆΠΈΠΌ способом.

1.1.8. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСний с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ VCL

ΠŸΡ€ΠΈ использовании VCL Π² простых случаях ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΌΠΈ сообщСниями Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ практичСски всС ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойств, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ событий ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сообщСния приходится ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Π§Π°Ρ‰Π΅ всСго это приходится Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ собствСнных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π½ΠΎ ΠΈ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… прилоТСниях это Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ.

ΠšΡ€ΠΎΠΌΠ΅ сообщСний, прСдусмотрСнных Π² систСмС, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ VCL ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ сообщСниями, созданными Π°Π²Ρ‚ΠΎΡ€Π°ΠΌΠΈ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π­Ρ‚ΠΈ сообщСния ΠΈΠΌΠ΅ΡŽΡ‚ прСфиксы CM_ ΠΈ CN_. Они Π½ΠΈΠ³Π΄Π΅ Π½Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Π½ΠΈΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ исходным ΠΊΠΎΠ΄Π°ΠΌ VCL. ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ собствСнных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² приходится ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ эти сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ здСсь Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒΡΡ Π² описании Ρ€Π°Π±ΠΎΡ‚Ρ‹ VCL с событиями.

Π’ Windows API Π½Π΅Ρ‚ понятия Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° β€” всС ΠΎΠΊΠ½Π°, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ родитСля (ΠΈΠ»ΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… систСмы), Ρ€Π°Π²Π½ΠΎΡ†Π΅Π½Π½Ρ‹, ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ послС закрытия Π»ΡŽΠ±Ρ‹Ρ… ΠΎΠΊΠΎΠ½. Но Π² VCL Π²Π²Π΅Π΄Π΅Π½ΠΎ понятиС Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹: Ρ„ΠΎΡ€ΠΌΠ°, которая создаСтся ΠΏΠ΅Ρ€Π²ΠΎΠΉ, становится Π³Π»Π°Π²Π½ΠΎΠΉ, ΠΈ Π΅Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ всСго прилоТСния.

Если ΠΎΠΊΠ½ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈ родитСля, Π½ΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… систСмы (Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠΊΠ½Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠΊΠ½Π°ΠΌΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня), Ρ‚ΠΎ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π·Π°Π΄Π°Ρ‡ появляСтся ΠΊΠ½ΠΎΠΏΠΊΠ°, связанная с этим ΠΎΠΊΠ½ΠΎΠΌ (ΠΎΠΊΠ½ΠΎ, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°, Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π·Π°Π²Π΅ΡΡ‚ΠΈΡΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ, Ссли ΠΎΠ½ΠΎ создано со стилСм WS_EX_APPWINDOW). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎ ΠΎΠΊΠ½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ уровня, ΠΈ ΠΎΠ½ΠΎ ΠΈΠ³Ρ€Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΡŒ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° этого прилоТСния, хотя систСма Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ нСсколько ΠΎΠΊΠΎΠ½ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня (ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ β€” Internet Explorer, Microsoft Word). Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ VCL пошли ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ: ΠΎΠΊΠ½ΠΎ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, отвСтствСнноС Π·Π° появлСниС ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π·Π°Π΄Π°Ρ‡, создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Application. ДСскриптор этого ΠΎΠΊΠ½Π° хранится Π² свойствС Application.Handle, Π° само ΠΎΠ½ΠΎ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΠΎ, Ρ‚.ΠΊ. ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹. Как ΠΈ любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅, это ΠΎΠΊΠ½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния. Главная Ρ„ΠΎΡ€ΠΌΠ° β€” это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅, с Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π·Π°Π΄Π°Ρ‡. Π’ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ связи ΠΌΠ΅ΠΆΠ΄Ρƒ этой ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΈ Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠΎΠΉ обСспСчиваСтся взаимодСйствиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Application ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ VCL. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π΅ VCL-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ создаСт Π΄Π²Π° ΠΎΠΊΠ½Π°: Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Application ΠΈ ΠΎΠΊΠ½ΠΎ Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹. Окно, создаваСмоС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Application, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ прилоТСния. НСвидимоС ΠΎΠΊΠ½ΠΎ прилоТСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ становится Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ (Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… систСмы) всСх Ρ„ΠΎΡ€ΠΌ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… явно Π½Π΅ установлСно свойство Parent, Π² Ρ‚ΠΎΠΌ числС ΠΈ Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹.