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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 8

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

Листинг

2.2. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° Project1.dpr

program Project1;

uses

Forms,

Unit1 in \'Unit1.pas\' {Form1};

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Windows ΠΈ Messages. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ константы, структуры Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с функциями Windows API, ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠ· систСмных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Messages ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ опрСдСлСния констант ΠΈ структур для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Windows-сообщСниями (ΠΎΠ± этом Π² ΠΏΠΎΠ΄Ρ€Π°Π·Π΄. «РСакция Π½Π° события элСмСнтов управлСния» Ρ€Π°Π·Π΄. 2.3).

БобствСнно, этих Π΄Π²ΡƒΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΊΠΎΠ½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΡ€Π°Π²Π΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WindowsAPI, стандартныС элСмСнты управлСния. Π’ листингС 2.3 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ элСмСнтарного Windows-прилоТСния. Π“Π»Π°Π²Π½ΠΎΠ΅, Π½Π° Ρ‡Ρ‚ΠΎ сСйчас стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, β€“ это Ρ€Π°Π·ΠΌΠ΅Ρ€ прилоТСния: всСго 15 ΠšΠ±Π°ΠΉΡ‚.

...

Листинг 2.3.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ€Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

program WinAPI;

uses

Windows, Messages;

{$R *.res}

begin

MessageBox(0, \'This is a test\', \'Little application\', MB_OK);

end.

Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π½Π΅ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ классов, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Borland. Но для чистоты экспСримСнта Π² этой Π³Π»Π°Π²Π΅ рассмотрим Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, построСнныС Π½Π° использовании Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Windows API.

2.2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ

Π Π°Π· ΡƒΠΆ Ρ€Π΅Ρ‡ΡŒ зашла ΠΎ прилоТСниях с ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΌ интСрфСйсом, Ρ‚ΠΎ самоС врСмя ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ срСдствами Windows API. Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ прилоТСния, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

1. Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ класс ΠΎΠΊΠ½Π° с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RegisterClass ΠΈΠ»ΠΈ RegisterClassEx.

2. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр ΠΎΠΊΠ½Π° зарСгистрированного Ρ€Π°Π½Π΅Π΅ класса.

3. ΠžΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСний, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ класса ΠΎΠΊΠ½Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 2.4.

...

Листинг 2.4.

РСгистрация класса ΠΎΠΊΠ½Π°

function RegisterWindow():Boolean;

var

wcx: WNDCLASSEX;

begin

ZeroMemory(Addr(wcx), SizeOf(wcx));

//Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ классС ΠΎΠΊΠ½Π°

wcx.cbSize := SizeOf(wcx);

wcx.hInstance := GetModuleHandle(nil);

wcx.hIcon := LoadIcon(0, IDI_ASTERISK); //Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Π·Π½Π°Ρ‡ΠΎΠΊ

wcx.hIconSm := wcx.hIcon;

wcx.hCursor := LoadCursor(0, IDC_ARROW); //Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

wcx.hbrBackground := GetStockObject(WHITE_BRUSH); //Π‘Π΅Ρ€Ρ‹ΠΉ

//Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°

wcx.style := 0;

//..самыС Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

wcx.lpszClassName := \'MyWindowClass\ //НазваниС класса

wcx.lpfnWndProc := Addr(WindowFunc); //АдрСс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

//ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

//РСгистрация класса ΠΎΠΊΠ½Π°

RegisterWindow := RegisterClassEx(wcx) <> 0;

end;

Π—Π΄Π΅ΡΡŒ сущСствСнным ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ структуры WNDCLASSEX ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ классС ΠΎΠΊΠ½Π°. Π‘Π°ΠΌΠΎΠΉ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Π²Π°ΠΌ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка:

...

wcx.lpfnWndProc := Addr(WindowFunc); //АдрСс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ сохранили адрСс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WindowFunc (листинг 2.5) β€“ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… сообщСний (Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ). ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RegisterClassEx систСма Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ этот адрСс ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ нСобходимости ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сообщСниС, ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠ΅Π΅ ΠΎΠΊΠ½Ρƒ. ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ рСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WindowFunc приводится Π² листингС 2.5.

...

Листинг 2.5.

Ѐункция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

//Ѐункция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

function WindowFunc(hWnd:HWND; msg:UINT; wParam:WPARAM;

lParam:LPARAM):LRESULT; stdcall;

var

ps: PAINTSTRUCT;

begin

case msg of

WM_CLOSE:

if (hWnd = hMainWnd) then

PostQuitMessage(0); //ΠŸΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΎΠΊΠ½Π° – Π²Ρ‹Ρ…ΠΎΠ΄

WM_PAINT:

begin

//ΠŸΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²ΠΊΠ° содСрТимого ΠΎΠΊΠ½Π°

BeginPaint(hWnd, ps);

TextOut(ps.hdc, 10, 10, \'ВСкст Π² ΠΎΠΊΠ½Π΅\', 12);

EndPaint(hWnd, ps);

end;

else

begin

//ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

WindowFunc := DefWindowProc(hWnd, msg, wParam, lParam);

Exit;

end;

end;

WindowFunc := S_OK; //Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ

end;

Π’ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСния WMPAINT – запроса Π½Π° пСрСрисовку содСрТимого ΠΎΠΊΠ½Π°. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСния WMCLOSE прСдусмотрСна для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° происходил Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· прилоТСния. Для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… сообщСний выполняСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: Ρ‚ΠΈΠΏΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ способ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌΠΈ, ΠΊΠ°ΠΊ Π² листингС 2.5. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ сообщСния. Π§Π°Ρ‰Π΅ всСго это SOK (константа, равная 0) Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния.

Π”Π°Π»Π΅Π΅ Π² листингС 2.6 приводится Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, собствСнно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ, созданиС ΠΎΠΊΠ½Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΡ‰Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСний для созданного ΠΎΠΊΠ½Π°.

...

Листинг 2.6.

РСгистрация ΠΈ созданиС ΠΎΠΊΠ½Π°. Π¦ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

program Window;

uses

Windows, Messages;

{$R *.res}

var

hMainWnd: HWND;

mess: MSG;

…

begin

//Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΊΠ½Π°

if not RegisterWindow() then Exit;

hMainWnd := CreateWindow(

\'MyWindowClass\', //Имя класса окна

\'Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ\', //Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π°

WS_VISIBLE or WS_OVERLAPPEDWINDOW,//Π‘Ρ‚ΠΈΠ»ΡŒ ΠΎΠΊΠ½Π°

//(ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ΡΡ, Π²ΠΈΠ΄ΠΈΠΌΠΎΠ΅)

CW_USEDEFAULT, //ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° X ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

CW_USEDEFAULT, //ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Y ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

CW_USEDEFAULT, //Π¨ΠΈΡ€ΠΈΠ½Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

CW_USEDEFAULT, //Высота ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

HWND(nil), //НСт Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°

HMENU(nil), //НСт мСню

GetModuleHandle(nil),

nil);

//Запуск Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

while (Longint(GetMessage(mess, HWND(nil), 0, 0)) <> 0)

do begin

TranslateMessage(mess);

DispatchMessage(mess);

end;

end.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ листингС 2.6 Π½Π° мСстС многоточия Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΊΠΎΠ΄Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ WindowFunc ΠΈ RegisterWindow. ΠŸΡ€ΠΈ создании ΠΎΠΊΠ½Π° использовались Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стили WS_VISIBLE ΠΈ WS_OVERLAPPEDWINDOWS. Но это Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ стили ΠΎΠΊΠΎΠ½. Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ 2 приводится список всСх стилСй ΠΎΠΊΠΎΠ½ (Ссли Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π½Π΅ сказано, Ρ‚ΠΎ стили ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° or). ΠšΡ€ΠΎΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateWindow, для создания ΠΎΠΊΠΎΠ½ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„yΠ½ΠΊΡ†ΠΈΡŽCreateWindowEx. ΠŸΡ€ΠΈ этом появится Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ (Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ) ΡΡ‚ΠΈΠ»ΡŒ ΠΎΠΊΠ½Π° (ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateWindowEx). Бписок Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… стилСй приводится всС Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ 2.

Π’ ΠΊΠΎΠ½Ρ†Π΅ листинга 2.6 располоТСн Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний:

...

while (Longint(GetMessage(mess, hMainWnd, 0, 0)) > 0)

do begin

TranslateMessage(mess);

DispatchMessage(mess);

end;

Π—Π΄Π΅ΡΡŒ API-функция GetMessage Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ значСния большС 0, ΠΏΠΎΠΊΠ° Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π΅ обнаруТится сообщСниС WMQUIT. Π’ случаС возникновСния ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ошибки функция GetMessage Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅-1. Ѐункция TranslateMessage ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ сообщСния Ρ‚ΠΈΠΏΠ° WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN ΠΈ WM_ SYSKEYUP Π’ сообщСния Π‘Π˜ΠœΠ’ΠžΠ›Π¬ΠΠžΠ“Πž Π²Π²ΠΎΠ΄Π° (WM_CHAR, WM_SYSCHAR, WM_DEADCHAR, WM_SYSDEADCHAR). Ѐункция DispatchMessage Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ сообщСния WMTIMER) Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°.

Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ самого ΠΎΠΊΠ½Π°, созданного Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, приводится Π½Π° рис. 2.2.

Рис. 2.2. Окно, созданноС Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ

ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΏΠΎΠΊΠ° Ρ€Π°Π·ΠΌΠ΅Ρ€ прилоТСния всСго 16 ΠšΠ±Π°ΠΉΡ‚.

2.3. Окно с элСмСнтами управлСния

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ‹ рассмотрСли созданиС ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ ΠΎΠΊΠ½Π°, самоС врСмя ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ Π΅Π³ΠΎ Π½Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ элСмСнтами управлСния. Для стандартных элСмСнтов управлСния Π² систСмС ΡƒΠΆΠ΅ зарСгистрированы классы ΠΎΠΊΠΎΠ½. Π˜Ρ… ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

β€’ BUTTON – ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΉ класс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Ρ„Π»Π°ΠΆΠΊΠ°, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Ρ ΠΈ Π΄Π°ΠΆΠ΅ Ρ€Π°ΠΌΠΊΠΈ для Π³Ρ€ΡƒΠΏΠΏΡ‹ элСмСнтов управлСния (GroupBox);

β€’ Π‘ΠžΠœΠ’ΠžΠ’ΠžΠ₯ – Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉΡΡ список;

β€’ EDIT – тСкстовоС ΠΏΠΎΠ»Π΅, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ однострочным, Ρ‚Π°ΠΊ ΠΈ многострочным, с полосами ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ ΠΈΠ»ΠΈ Π±Π΅Π·;

β€’ LISTBOX – список;

β€’ SCROLLBAR – полоса ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ;

β€’ STATIC – статичСский тСкст (ΠΎΠ½ ΠΆΠ΅ Label, надпись, ΠΌΠ΅Ρ‚ΠΊΠ° ΠΈ ΠΏΡ€.), ΠΊΡ€ΠΎΠΌΠ΅ тСкста, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Π’Π²ΠΈΠ΄Ρƒ большого количСства Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… стилСй ΠΎΠΊΠΎΠ½ элСмСнтов управлСния ΠΈΡ… ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ здСсь Π½Π΅ приводится, Π½ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ 2.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ элСмСнтов управлСния

ЦСлСсообразно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создания элСмСнтов управлСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹, формируя интСрфСйс Ρ„ΠΎΡ€ΠΌΡ‹ Β«Π½Π° Π»Π΅Ρ‚ΡƒΒ», Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Β«ΡƒΠΊΡ€Π°ΡˆΠ°Ρ‚ΡŒΒ» ΠΊΠΎΠ΄ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ CreateWindow tumCreateWindowEx. Π­Ρ‚ΠΈΠΌ ΠΌΡ‹ сСйчас ΠΈ займСмся. Π‘Ρ€Π°Π·Ρƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ: прСдполагаСтся, Ρ‡Ρ‚ΠΎ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Controls Π² Ρ„Π°ΠΉΠ»Π΅ Controls.pas), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ hAppInst ΠΈ hParentWnd. Π­Ρ‚ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈΠ· пСрСчислСнных Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ создания ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с элСмСнтами управлСния (ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² листингС 2.21).

...

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅!

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ id Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ создания ΠΈ манипулирования элСмСнтами управлСния. Π­Ρ‚ΠΎ цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ элСмСнты управлСния Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°.

Π˜Ρ‚Π°ΠΊ, для создания ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· листинга 2.7 (всС рассмотрСнныС Π΄Π°Π»Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создания элСмСнтов управлСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ дСскриптор созданного ΠΎΠΊΠ½Π°).

...

Листинг 2.7.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ

function CreateButton(x, y, width, height, id:Integer;

caption : String):HWND;

begin

CreateButton :=

CreateWindow(\'BUTTON\', PAnsiChar(caption), WS_CHILD or

WS_VISIBLE or BS_PUSHBUTTON or WS_TABSTOP,

x, y, width, height, hParentWnd, HMENU(id),

hAppInst, nil);

end;

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² листингС 2.8 функция создаСт Ρ„Π»Π°ΠΆΠΎΠΊ ΠΈ устанавливаСт Π΅Π³ΠΎ.

...

Листинг 2.8.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Π»Π°ΠΆΠΊΠ°