Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Jarosław Kuchta Komunikaty w Windows
2
Okna i procedury okien W Windows każde okno ma swoją procedurę sterującą. LRESULT CALLBACK WndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { … } gdzie: hWnd jest uchwytem – identyfikatorem okna message jest komunikatem kierowanym do okna wParam jest parametrem krótkim komunikatu lParam jest parametrem długim komunikatu
3
Komunikaty Komunikat jest poleceniem do wykonania dla procedury okna
Rodzaje komunikatów: komunikaty systemowe (generowane przez system w reakcji na zdarzenia pochodzące od urządzeń) komunikaty aplikacji (zdefiniowane w aplikacji i wysyłane od okna do okna).
4
Komunikaty systemowe – rozpoznawane przez przedrostek
WM_ - duża grupa komunikatów ogólnych CCM_ - komunikaty uogólnione różnych kontrolek EM_, EN_ - komunikaty pola edycji CDM_ - komunikaty dialogów (np. otwarcia pliku) …
5
Komunikaty ogólne komunikaty okien powiadomienia o zdarzeniach okien
powiadomienia o zdarzeniach klawiatury komunikaty klawiatury powiadomienia o skrótach klawiaturowych komunikaty skrótów klawiaturowych powiadomienia o zdarzeniach myszy …
6
Komunikaty okien WM_PAINT – odrysowanie okna
WM_GETFONT – pobranie czcionki okna WM_SETFONT – ustawienie czcionki okna WM_SETICON – ustawienie ikony okna WM_SETTEXT – wpisanie tekstu do okna (kontrolka też jest oknem) WM_GETTEXTLENGTH – pobranie długości tekstu wprowadzonego do okna WM_GETTEXT – pobranie tekstu wprowadzonego do okna …
7
Powiadomienia o zdarzeniach okien
WM_CREATE – okno zostało utworzone WM_ACTIVATE – okno zostało aktywowane WM_ENABLE – okno dostało zezwolenie na przyjmowanie komunikatów od klawiatury i myszy WM_SETFOCUS – okno będzie otrzymywać powiadomienia o zdarzeniach od klawiatury WM_KILLFOCUS – okno przestaje otrzymywać powiadomienia o zdarzeniach od klawiatury (tylko jedno okno dostaje WM_CLOSE – okno zostało zamknięte WM_DESTROY – okno zostało zniszczone …
8
Powiadomienia o zdarzeniach klawiatury
WM_KEYDOWN – klawisz został naciśnięty WM_KEYUP – klawisz został zwolniony WM_CHAR – przyszedł znak od klawiatury …
9
Powiadomienia o zdarzeniach myszy
WM_LBUTTONDOWN – lewy przycisk naciśnięty WM_LBUTTONUP – lewy przycisk zwolniony WM_LBUTTONDBLCLK – lewy przycisk naciśnięty dwukrotnie WM_MBUTTONDOWN – środkowy przycisk naciśnięty WM_MBUTTONUP – środkowy przycisk zwolniony WM_MBUTTONDBLCLK – środkowy przycisk naciśnięty dwukrotnie WM_RBUTTONDOWN – prawy przycisk naciśnięty WM_RBUTTONUP – prawy przycisk zwolniony WM_RBUTTONDBLCLK – prawy przycisk naciśnięty dwukrotnie WM_MOUSEMOVE – mysz przesunięta WM_MOUSEWHEEL – kółko myszy przekręcone
10
Przekazywanie komunikatów
komunikaty niekolejkowane komunikaty kolejkowane
11
Komunikaty niekolejkowane
Wymagają natychmiastowej reakcji okna, np.: WM_ACTIVATE WM_SETFOCUS WM_SETCURSOR Wysyłane przez funkcje: SendMessage SendMessageTimeout SendNotifyMessage BroadcastSystemMessage
12
Funkcja SendMessage LRESULT WINAPI SendMessage( __in HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam ); Wysyła komunikat do procedury okna i czeka na jego obsłużenie. Nie powraca, dopóki okno docelowe nie zareaguje na komunikat.
13
Funkcja SendMessageTimeout
LRESULT WINAPI SendMessageTimeout( __in HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam, __in UINT fuFlags, __in UINT uTimeout, __out_opt PDWORD_PTR lpdwResult ); Wysyła komunikat do okna i czeka na jego obsłużenie, ale tylko określony czas. Umożliwia przesłanie komunikatu do wszystkich okien najwyższego poziomu (głównych okien programów).
14
Funkcja SendNotifyMessage
LRESULT WINAPI SendNotifyMessage( __in HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam ); Wysyła komunikat do okna i: jeśli okno należy do tego samego wątku, to czeka na jego obsłużenie, jeśli nie, to przekazuje komunikat do procedury okna i wraca od razu.
15
Funkcja BroadcastSystemMessage
long WINAPI BroadcastSystemMessage( __in DWORD dwFlags, __inout_opt LPDWORD lpdwRecipients, __in UINT uiMessage, __in WPARAM wParam, __in LPARAM lParam ); Wysyła komunikat do określonych odbiorców: aplikacji instalowanych sterowników urządzeń systemowych sterowników urządzeń sterowników sieciowych
16
Funkcja SendMessage LRESULT WINAPI SendMessage( __in HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam ); Wysyła komunikat do okna i czeka na jego obsłużenie. Nie powraca, dopóki okno docelowe nie zareaguje na komunikat.
17
Komunikaty kolejkowane
komunikaty od klawiatury komunikaty od myszy inne, które nie muszą być obsłużone natychmiast umieszczane w kolejce komunikatów
18
Kolejki komunikatów Pojedyncza kolejka systemowa
Kolejki własne wątków GUI Inicjalnie każdy wątek jest tworzony bez kolejki komunikatów Dla wątku, który wywołuje funkcje GUI, przy pierwszym wywołaniu tworzona jest kolejka komunikatów. Funkcje nie należące do GUI nie tworzą kolejki komunikatów.
19
Wysyłanie komunikatów do kolejki
Funkcje: PostMessage PostThreadMessage Komunikaty są umieszczane na końcu kolejki. Komunikaty opuszczają kolejkę i są przekazywane do procedury okna w kolejności ich umieszczania w kolejce z wyjątkiem: WM_PAINT WM_TIMER WM_QUIT które są zatrzymywane w kolejce do czasu, aż nie ma w niej innych komunikatów i wtedy są przekazywane do procedury okna
20
Funkcja PostMessage LRESULT WINAPI PostMessage( __in HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam ); Wysyła komunikat do kolejki wątku skojarzonego z oknem i powraca natychmiast
21
Funkcja PostThreadMessage
LRESULT WINAPI PostThreadMessage( __in DWORD idThread , __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam ); Wysyła komunikat do kolejki określonego wątku i powraca natychmiast
22
Pętla obsługi komunikatów
Aplikacja pobiera w pętli komunikaty z kolejki, tłumaczy je i kieruje do właściwej procedury okna. MSG msg; BOOL bRet; while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) // handle the error and possibly exit } else TranslateMessage(&msg); DispatchMessage(&msg);
23
Funkcja GetMessage BOOL WINAPI GetMessage( __out LPMSG lpMsg, __in_opt HWND hWnd, __in UINT wMsgFilterMin, __in UINT wMsgFilterMax ); Pobiera z kolejki komunikat kierowany do określonego okna. Umożliwia filtrowanie komunikatów. Wynik podaje w strukturze LPMSG
24
Funkcja TranslateMessage
BOOL WINAPI TranslateMessage( __in const MSG *lpMsg ); Tłumaczy komunikaty klawiatury, np.: WM_KEYDOWN i WM_KEYUP są tłumaczone na WM_CHAR (gdy to możliwe)
25
Funkcja DispatchMessage
LRESULT WINAPI DispatchMessage( __in const MSG *lpmsg ); Kieruje komunikat do właściwego okna określonego w strukturze MSG
26
Obsługa komunikatów HWND hwndCombo; int cTxtLen; PSTR pszMem;
switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDD_ADDCBITEM: // handle of the combo box message return TRUE; … } break;
27
Funkcja PeekMessage BOOL WINAPI PeekMessage( __out LPMSG lpMsg, __in_opt HWND hWnd, __in UINT wMsgFilterMin, __in UINT wMsgFilterMax, __in UINT wRemoveMsg ); Przekazuje komunikaty wysłane metodą Send, sprawdza, czy w kolejce są komunikaty i zwraca komunikat (gdy kolejka jest niepusta)
28
Sprawdzanie komunikatów w czasie długotrwałych operacji
HWND hwnd; BOOL fDone; MSG msg; // Begin the operation and continue until it is complete // or until the user clicks the mouse or presses a key. fDone = FALSE; while (!fDone) { fDone = DoLengthyOperation(); // application-defined function // Remove any messages that may be in the queue. If the // queue contains any mouse or keyboard messages, end the operation. while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) switch(msg.message) { case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_KEYDOWN: // Perform any required cleanup. fDone = TRUE; }
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.