Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Komunikaty w Windows Jarosław Kuchta. Okna i procedury okien W Windows każde okno ma swoją procedurę sterującą. W Windows każde okno ma swoją procedurę

Podobne prezentacje


Prezentacja na temat: "Komunikaty w Windows Jarosław Kuchta. Okna i procedury okien W Windows każde okno ma swoją procedurę sterującą. W Windows każde okno ma swoją procedurę"— Zapis prezentacji:

1 Komunikaty w Windows Jarosław Kuchta

2 Okna i procedury okien W Windows każde okno ma swoją procedurę sterującą. W Windows każde okno ma swoją procedurę sterującą. LRESULT CALLBACK WndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { … } gdzie: gdzie: hWnd jest uchwytem – identyfikatorem okna hWnd jest uchwytem – identyfikatorem okna message jest komunikatem kierowanym do okna message jest komunikatem kierowanym do okna wParam jest parametrem krótkim komunikatu wParam jest parametrem krótkim komunikatu lParam jest parametrem długim komunikatu lParam jest parametrem długim komunikatu

3 Komunikaty Komunikat jest poleceniem do wykonania dla procedury okna Komunikat jest poleceniem do wykonania dla procedury okna Rodzaje komunikatów: Rodzaje komunikatów: komunikaty systemowe (generowane przez system w reakcji na zdarzenia pochodzące od urządzeń) 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). 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 WM_ - duża grupa komunikatów ogólnych CCM_ - komunikaty uogólnione różnych kontrolek CCM_ - komunikaty uogólnione różnych kontrolek EM_, EN_ - komunikaty pola edycji EM_, EN_ - komunikaty pola edycji CDM_ - komunikaty dialogów (np. otwarcia pliku) CDM_ - komunikaty dialogów (np. otwarcia pliku) …

5 Komunikaty ogólne komunikaty okien komunikaty okien powiadomienia o zdarzeniach okien powiadomienia o zdarzeniach okien powiadomienia o zdarzeniach klawiatury powiadomienia o zdarzeniach klawiatury komunikaty klawiatury komunikaty klawiatury powiadomienia o skrótach klawiaturowych powiadomienia o skrótach klawiaturowych komunikaty skrótów klawiaturowych komunikaty skrótów klawiaturowych powiadomienia o zdarzeniach myszy powiadomienia o zdarzeniach myszy …

6 Komunikaty okien WM_PAINT – odrysowanie okna WM_PAINT – odrysowanie okna WM_GETFONT – pobranie czcionki okna WM_GETFONT – pobranie czcionki okna WM_SETFONT – ustawienie czcionki okna WM_SETFONT – ustawienie czcionki okna WM_SETICON – ustawienie ikony okna WM_SETICON – ustawienie ikony okna WM_SETTEXT – wpisanie tekstu do okna (kontrolka też jest oknem) WM_SETTEXT – wpisanie tekstu do okna (kontrolka też jest oknem) WM_GETTEXTLENGTH – pobranie długości tekstu wprowadzonego do okna WM_GETTEXTLENGTH – pobranie długości tekstu wprowadzonego do okna WM_GETTEXT – pobranie tekstu wprowadzonego do okna WM_GETTEXT – pobranie tekstu wprowadzonego do okna …

7 Powiadomienia o zdarzeniach okien WM_CREATE – okno zostało utworzone WM_CREATE – okno zostało utworzone WM_ACTIVATE – okno zostało aktywowane WM_ACTIVATE – okno zostało aktywowane WM_ENABLE – okno dostało zezwolenie na przyjmowanie komunikatów od klawiatury i myszy 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_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_KILLFOCUS – okno przestaje otrzymywać powiadomienia o zdarzeniach od klawiatury (tylko jedno okno dostaje WM_CLOSE – okno zostało zamknięte WM_CLOSE – okno zostało zamknięte WM_DESTROY – okno zostało zniszczone WM_DESTROY – okno zostało zniszczone …

8 Powiadomienia o zdarzeniach klawiatury WM_KEYDOWN – klawisz został naciśnięty WM_KEYDOWN – klawisz został naciśnięty WM_KEYUP – klawisz został zwolniony WM_KEYUP – klawisz został zwolniony WM_CHAR – przyszedł znak od klawiatury WM_CHAR – przyszedł znak od klawiatury …

9 Powiadomienia o zdarzeniach myszy WM_LBUTTONDOWN – lewy przycisk naciśnięty WM_LBUTTONDOWN – lewy przycisk naciśnięty WM_LBUTTONUP – lewy przycisk zwolniony WM_LBUTTONUP – lewy przycisk zwolniony WM_LBUTTONDBLCLK – lewy przycisk naciśnięty dwukrotnie WM_LBUTTONDBLCLK – lewy przycisk naciśnięty dwukrotnie WM_MBUTTONDOWN – środkowy przycisk naciśnięty WM_MBUTTONDOWN – środkowy przycisk naciśnięty WM_MBUTTONUP – środkowy przycisk zwolniony WM_MBUTTONUP – środkowy przycisk zwolniony WM_MBUTTONDBLCLK – środkowy przycisk naciśnięty dwukrotnie WM_MBUTTONDBLCLK – środkowy przycisk naciśnięty dwukrotnie WM_RBUTTONDOWN – prawy przycisk naciśnięty WM_RBUTTONDOWN – prawy przycisk naciśnięty WM_RBUTTONUP – prawy przycisk zwolniony WM_RBUTTONUP – prawy przycisk zwolniony WM_RBUTTONDBLCLK – prawy przycisk naciśnięty dwukrotnie WM_RBUTTONDBLCLK – prawy przycisk naciśnięty dwukrotnie WM_MOUSEMOVE – mysz przesunięta WM_MOUSEMOVE – mysz przesunięta WM_MOUSEWHEEL – kółko myszy przekręcone WM_MOUSEWHEEL – kółko myszy przekręcone

10 Przekazywanie komunikatów komunikaty niekolejkowane komunikaty niekolejkowane komunikaty kolejkowane komunikaty kolejkowane

11 Komunikaty niekolejkowane Wymagają natychmiastowej reakcji okna, np.: Wymagają natychmiastowej reakcji okna, np.: WM_ACTIVATE WM_ACTIVATE WM_SETFOCUS WM_SETFOCUS WM_SETCURSOR WM_SETCURSOR Wysyłane przez funkcje: Wysyłane przez funkcje: SendMessage SendMessage SendMessageTimeout SendMessageTimeout SendNotifyMessage SendNotifyMessage BroadcastSystemMessage BroadcastSystemMessage

12 Funkcja SendMessage LRESULT WINAPI SendMessage( __in HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam ); 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. Wysyła komunikat do procedury okna i czeka na jego obsłużenie. Nie powraca, dopóki okno docelowe nie zareaguje na komunikat. 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 ); 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. 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). 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 ); LRESULT WINAPI SendNotifyMessage( __in HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam ); Wysyła komunikat do okna i: 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 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. 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 ); 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: Wysyła komunikat do określonych odbiorców: aplikacji aplikacji instalowanych sterowników urządzeń instalowanych sterowników urządzeń systemowych sterowników urządzeń systemowych sterowników urządzeń sterowników sieciowych sterowników sieciowych

16 Funkcja SendMessage LRESULT WINAPI SendMessage( __in HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam ); 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. Wysyła komunikat do okna i czeka na jego obsłużenie. Nie powraca, dopóki okno docelowe nie zareaguje na komunikat. Nie powraca, dopóki okno docelowe nie zareaguje na komunikat.

17 Komunikaty kolejkowane komunikaty od klawiatury komunikaty od klawiatury komunikaty od myszy komunikaty od myszy inne, które nie muszą być obsłużone natychmiast inne, które nie muszą być obsłużone natychmiast umieszczane w kolejce komunikatów umieszczane w kolejce komunikatów

18 Kolejki komunikatów Pojedyncza kolejka systemowa Pojedyncza kolejka systemowa Kolejki własne wątków GUI Kolejki własne wątków GUI Inicjalnie każdy wątek jest tworzony bez kolejki komunikatów 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. 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. Funkcje nie należące do GUI nie tworzą kolejki komunikatów.

19 Wysyłanie komunikatów do kolejki Funkcje: Funkcje: PostMessage PostMessage PostThreadMessage PostThreadMessage Komunikaty są umieszczane na końcu kolejki. 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: Komunikaty opuszczają kolejkę i są przekazywane do procedury okna w kolejności ich umieszczania w kolejce z wyjątkiem: WM_PAINT WM_PAINT WM_TIMER WM_TIMER WM_QUIT 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 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 ); 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 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 ); 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 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. 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 ); 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. Pobiera z kolejki komunikat kierowany do określonego okna. Umożliwia filtrowanie komunikatów. Umożliwia filtrowanie komunikatów. Wynik podaje w strukturze LPMSG Wynik podaje w strukturze LPMSG

24 Funkcja TranslateMessage BOOL WINAPI TranslateMessage( __in const MSG *lpMsg ); 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) 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 ); LRESULT WINAPI DispatchMessage( __in const MSG *lpmsg ); Kieruje komunikat do właściwego okna określonego w strukturze MSG 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 ); 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, Przekazuje komunikaty wysłane metodą Send, sprawdza, czy w kolejce są komunikaty sprawdza, czy w kolejce są komunikaty i zwraca komunikat (gdy kolejka jest niepusta) 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 fDone = DoLengthyOperation(); // application-defined function // Remove any messages that may be in the queue. If the // Remove any messages that may be in the queue. If the // queue contains any mouse or keyboard messages, end the operation. // queue contains any mouse or keyboard messages, end the operation. while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) { switch(msg.message) switch(msg.message) { case WM_LBUTTONDOWN: { case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_RBUTTONDOWN: case WM_KEYDOWN: case WM_KEYDOWN: // Perform any required cleanup. // Perform any required cleanup. fDone = TRUE; fDone = TRUE; } }}


Pobierz ppt "Komunikaty w Windows Jarosław Kuchta. Okna i procedury okien W Windows każde okno ma swoją procedurę sterującą. W Windows każde okno ma swoją procedurę"

Podobne prezentacje


Reklamy Google