1 / 28

Komunikaty w Windows

Jarosław Kuchta. Komunikaty w Windows. 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

galya
Télécharger la présentation

Komunikaty w Windows

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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; } } }

More Related