Programowanie Windows Tworzenie graficznego interfejsu uytkownika GUI Jacek

  • Slides: 18
Download presentation
Programowanie Windows Tworzenie graficznego interfejsu użytkownika (GUI) Jacek Matulewski 15 marca 2015 http: //www.

Programowanie Windows Tworzenie graficznego interfejsu użytkownika (GUI) Jacek Matulewski 15 marca 2015 http: //www. fizyka. umk. pl/~jacek/dydaktyka/winprog/

Powtórzenie • Rozwinięcie projektu „Win. Main_Inicjacja. Okna” • • Funkcja Win. Main (wejście, ang.

Powtórzenie • Rozwinięcie projektu „Win. Main_Inicjacja. Okna” • • Funkcja Win. Main (wejście, ang. entry point) Klasa C++ okna Okno Procedura okna, funkcja Wnd. Proc i metoda klasy C++ Tworzenie okna (Register. Class. Ex, Create. Window) • Kontrolki są oknami – otrzymują komunikaty

Tworzenie i obsługa kontrolek GUI • Tworzenie kontrolki: Create. Window • Korzystamy z istniejących

Tworzenie i obsługa kontrolek GUI • Tworzenie kontrolki: Create. Window • Korzystamy z istniejących klas: klasa przycisku jest zarejestrowana pod nazwą „Button”, suwaka - „msctls_trackbar 32” (alias TRACKBAR_CLASS) • Aby kontrolka była „żywa”, okno musi reagować na komunikaty WM_COMMAND przysyłane po kliknięciu przycisku • My określamy numer w. Param identyfikujący przycisk

Tworzenie przycisków • Funkcja składowa tworząca dwa przyciski: void COkno: : Tworz. Przyciski(HWND uchwyt.

Tworzenie przycisków • Funkcja składowa tworząca dwa przyciski: void COkno: : Tworz. Przyciski(HWND uchwyt. Okna. Rodzica) { h. Przycisk. Hello = Create. Window( "Button", //nazwa klasy "Hello World!", //etykieta WS_CHILD | WS_VISIBLE, //styl 30, 200, 70, //geometria uchwyt. Okna. Rodzica, (HMENU)ID_BUTTON_HELLO, //identyfikator (w. Param) wc. h. Instance, NULL);

Tworzenie przycisków • Funkcja składowa tworząca dwa przyciski: void COkno: : Tworz. Przyciski(HWND uchwyt.

Tworzenie przycisków • Funkcja składowa tworząca dwa przyciski: void COkno: : Tworz. Przyciski(HWND uchwyt. Okna. Rodzica) { Uchwyt do „okna” przycisku. . . h. Przycisk. Zamknij = Create. Window( "Button", "Zamknij", WS_CHILD | WS_VISIBLE, 240, 30, 200, 70, uchwyt. Okna. Rodzica, (HMENU)ID_BUTTON_ZAMKNIJ, wc. h. Instance, NULL); }

Obsługa przycisków • Funkcja składowa dedykowana do obsługi przycisków: void COkno: : Obsluga. Przyciskow(WPARAM

Obsługa przycisków • Funkcja składowa dedykowana do obsługi przycisków: void COkno: : Obsluga. Przyciskow(WPARAM w. Param) { switch(w. Param) { Przekształcanie komunikatów (klawiatury) case ID_BUTTON_HELLO: Message. Box(this->uchwyt. Okna, "Hello World!", "Witaj świecie!", MB_OK); break; case ID_BUTTON_ZAMKNIJ: Post. Message(this->uchwyt. Okna, WM_CLOSE, 0, 0); break; } }

Tworzenie i obsługa w Wnd. Proc • Wywołanie obu metod w procedurze okna LRESULT

Tworzenie i obsługa w Wnd. Proc • Wywołanie obu metod w procedurze okna LRESULT COkno: : Wnd. Proc(HWND h. Wnd, UINT message, WPARAM w. Param, LPARAM l. Param) { switch (message) { case WM_CREATE: Tworz. Przyciski(h. Wnd); break; case WM_COMMAND: Obsluga. Przyciskow(w. Param); break; . . .

Demo: Przyciski • Kontynuacja aplikacji „Win. Main_Inicjacja. Okna” • Czyste Win. API (z pustego

Demo: Przyciski • Kontynuacja aplikacji „Win. Main_Inicjacja. Okna” • Czyste Win. API (z pustego projektu)

Inne kontrolki • Z innymi kontrolkami z GDI jest podobnie… • Panel, który nie

Inne kontrolki • Z innymi kontrolkami z GDI jest podobnie… • Panel, który nie reaguje na działania użytkownika: h. Panel = Create. Window( "STATIC", "", //pusta etykieta WS_CHILD | WS_VISIBLE, margines, szerokosc, wysokosc, h. Wnd, //uchwyt okna (HMENU)ID_PANEL, wc. h. Instance, //Get. Module. Handle(NULL), NULL);

Inne kontrolki • Kontrolki z biblioteki Common Controls (plik comctl 32. dll) • Inicjacja

Inne kontrolki • Kontrolki z biblioteki Common Controls (plik comctl 32. dll) • Inicjacja biblioteki za pomocą funkcji Init. Common. Controls. Ex, • Struktura INITCOMMONCONTROLSEX pozwala określić, które zbiory bibliotek wczytać np. ICC_BAR_CLASSES • Tworzenie standardowo za pomocą funkcji Create. Window RECT rect; HWND hwnd. Track = Create. Window( TRACKBAR_CLASS, "Kontrolka Trackbar", WS_CHILD | WS_VISIBLE | TBS_ENABLESELRANGE | TBS_AUTOTICKS, rect. left, rect. top, . . .

Inne kontrolki • W czystym Win. API nie mamy klas pozwalających na łatwe ustalanie

Inne kontrolki • W czystym Win. API nie mamy klas pozwalających na łatwe ustalanie własności kontrolek (por. MFC, VCL, QT); konfigurowanie kontrolek możliwe dzięki wysyłaniu do nich komunikatów (z pominięciem okna): Send. Message(hwnd. Track, TBM_SETRANGE, (WPARAM) TRUE, (LPARAM) MAKELONG(min, max)); Send. Message(hwnd. Track, TBM_SETPAGESIZE, 0, (LPARAM) 4); Send. Message(hwnd. Track, TBM_SETTICFREQ, 15, (LPARAM) 1); Send. Message(hwnd. Track, TBM_SETSEL, (WPARAM) FALSE, (LPARAM) MAKELONG(sel. Min, sel. Max)); Send. Message(hwnd. Track, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) sel. Min); Set. Focus(hwnd. Track);

Inne kontrolki • Procedura okna – przesuwanie suwaków, powoduje zmianę koloru panelu (pozycje suwaków

Inne kontrolki • Procedura okna – przesuwanie suwaków, powoduje zmianę koloru panelu (pozycje suwaków = składowe RGB koloru) i odświeżenie panelu case WM_CTLCOLORSTATIC: { DWORD dw. Pos 1 = Send. Message(h. Track. Bar 1, TBM_GETPOS, 0, 0); DWORD dw. Pos 2 = Send. Message(h. Track. Bar 2, TBM_GETPOS, 0, 0); DWORD dw. Pos 3 = Send. Message(h. Track. Bar 3, TBM_GETPOS, 0, 0); HWND h. Ctl =(HWND)l. Param; HBRUSH brush=Create. Solid. Brush( RGB((int)dw. Pos 1, (int)dw. Pos 2, (int)dw. Pos 3)); if(h. Ctl == h. Panel) return (LRESULT) brush; else return (LRESULT)Get. Stock. Object(WHITE_BRUSH); } case WM_HSCROLL: Redraw. Window(h. Panel, NULL, RDW_INVALIDATE); break;

Demo: Kolory • Kontynuacja aplikacji „Przyciski” • Czyste Win. API (z pustego projektu) •

Demo: Kolory • Kontynuacja aplikacji „Przyciski” • Czyste Win. API (z pustego projektu) • Adaptacja rozmiaru kontrolek przy zmianie rozmiaru okna

Odczyt i zmiana „własności” okien • MSDN „Develop desktop apps”: https: //msdn. microsoft. com/pl-pl/library/windows/desktop/

Odczyt i zmiana „własności” okien • MSDN „Develop desktop apps”: https: //msdn. microsoft. com/pl-pl/library/windows/desktop/ Lista funkcji dotyczących okien i kontrolek : https: //msdn. microsoft. com/pl-pl/library/windows/desktop/ms 632595(v=vs. 85). aspx • • Pierwszym argumentem tych funkcji jest zawsze uchwyt okna Tytuł okna: Set. Window. Text, Get. Window. Test, Równoważne wysłanie komunikatu: WM_SETTEXT Położenie: Set. Window. Placement, Set. Window. Pos, Są również analogiczne funkcje Get. . • Funkcja: Move. Window, Show. Window • Set. Active. Window, Set. Foreground. Window. Rect • Bring. Window. Top, funkcje Get. . oraz Get. Top. Window

Odczyt i zmiana „własności” okien • Kontrolki i okna-dzieci: Set. Parent, Get. Parent •

Odczyt i zmiana „własności” okien • Kontrolki i okna-dzieci: Set. Parent, Get. Parent • Informacje o oknie: Get. Window. Info • Położenie inaczej: Get. Window. Rect, Get. Client. Rect (por. Get. Window. Pos i Get. Window. Placement), Struktura RECT (left, top, right, bottom) • Adjust. Window. Rect(Ex) – oblicza zewnętrzny rozmiar okna na podstawie podanego rozmiaru obszaru klienta • Zamykanie: Close. Window, Destroy. Window Pierwsza wysyła komunikat WM_CLOSE, w którym można wyświetlić pytanie. Jeżeli jest zgoda na zamknięcie, należy wywołać drugą funkcję, która rzeczywiście zamyka okno • Animate. Window – animacje tworzenia i zamykania okna

Demo: Lista okien (MFC) • Funkcje: Enum. Windows, Enum. Child. Windows • Callback: Enum.

Demo: Lista okien (MFC) • Funkcje: Enum. Windows, Enum. Child. Windows • Callback: Enum. Window. Proc

Ciekawostka: zmiana kształtu okna • Regiony, region dostępny poprzez uchwyt HRGN • Tworzenie regionów:

Ciekawostka: zmiana kształtu okna • Regiony, region dostępny poprzez uchwyt HRGN • Tworzenie regionów: Create. Rect. Rgn, Create. Round. Rect. Rgn, Create. Elliptic. Rgn, Create. Polygon. Rgn, Combine. Rgn • Wypełnianie regionu: Fill. Rgn (argumentem jest pędzel) • Ustalanie kształtu okna na bazie regionów: Set. Window. Rgn, Get. Window. Rgn • Inne zastosowanie: detekcja ruchu i kliknięć myszy

Przykładowe pytania • Jakiej funkcji należy użyć do utworzenia okna, a jakiej do utworzenia

Przykładowe pytania • Jakiej funkcji należy użyć do utworzenia okna, a jakiej do utworzenia „kontrolki”? • Czym jest klasa okna? Jakie zawiera informacje? • Jaka funkcja służy do znalezienia uchwytu okna o znanej nazwie klasy? • Do czego służy procedura okna? • Jak wykonać pętlę po wszystkich oknach i ich oknachdzieciach? • Do czego służy funkcja Adjust. Window. Rect? • Czy można zmienić tytuł okna z innej aplikacji? Jakiej użyć do tego funkcji? A jakiej w przypadku „własnego” okna?