Stronę tą wyświetlono już: 5354 razy
Kod programu
Na wcześniejszej stronie omówiony został sposób tworzenia nowego projektu o nazwie HelloWorld. Tym razem utworzony projekt będzie wykorzystywał własnoręcznie utworzone okno programu w celu wyświetlenia tego samego tekstu. Rozpocząć należy oczywiście od utworzenia projektu, tym razem niech jego nazwa będzie np. HelloWorld2. Projekt musi być pusty i należy dodać do niego plik winmain.cpp w sposób wcześniej już omawiany.
Oto kod prostego programu, którego jedynym celem będzie wyświetlania napisu Witaj świecie:
W powyższym kodzie rejestracja klasy okna odbywa się za pomocą funkcji RegisterClass, która przyjmuje jako jedyny parametr wskaźnik do struktury WNDCLASS. Przeznaczenie wszystkich pól struktury WNDCLASS zostało wyjaśnione w kodzie programu. Tworzenie okna programu oraz jego uchwytu HWND odbywa się za pomocą funkcji CreateWindow, której parametry również opisałem w kodzie. Dalej są funkcje odpowiedzialne za wyświetlenie okna ShowWindow oraz pierwsze jego odświeżenie UpdateWindow. Następnie potrzebna jest struktura do przetwarzania komunikatów oraz funkcja GetMessage do ich przechwytywania. Tłumaczenie i rozpakowywanie otrzymanego komunikatu odbywa się odpowiednio za pomocą funkcji TranslateMessage i DispatchMessage.
W funkcji procedury okna hwndProc warto przyjrzeć się dwóm komunikatom WM_SIZE oraz WM_PAINT. Pierwszy z nich odpowiedzialny jest za pozyskiwanie informacji o rozmiarze okna, które z kolei przechowywane są w zmiennej statycznej typu RECT (skrót od rectangle - prostokąt). Do wypełnienia tej struktury wykorzystana została funkcja SetRect. Co ciekawe w parametrze lParam funkcji hwndProc zawarta została informacja na temat rozmiaru obszaru okna. Okazuje się bowiem, że pierwszych 16 bitów parametru lParam zawiera informację o szerokości okna natomiast następne 16 bitów zawiera informacje o wysokości okna. Do wyciągnięcia tych informacji użyto makr LOWORD (skrót od low word - niższe słowo) oraz HIWORD (skrót od hight word - wyższe słowo).
Komunikat WM_PAINT wykorzystuje w swym wnętrzu strukturę typu PAINTSTRUCT oraz dwie kluczowe funkcje BeginPaint - dzięki której pozyskiwany jest kontekst urządzenia HDC oraz na końcu EndPaint. Ważnym jest aby wiedzieć, że struktury PAINSTRUCT oraz funkcji BeginPaint i EndPaint można używać tylko i wyłącznie w komunikacie WM_PAINT i nigdzie indziej.
Makra, funkcje i struktury użyte w kodzie
Poniżej zamieszczam spis nowo użytych makr występujących w kodzie programu:
- LOWORD - wyciąga najniższych 16-bitów z zmiennej 32-bitowej;
- HIWORD - wyciąga ostatnich 16-bitów z zmiennej 32-bitowej;
- RGB - makro tworzące zmienną 24-bitową typu COLORREF opisującą kolor w systemie rgb (czerwony, zielony, niebieski).
Lista funkcji:
- BeginPaint - funkcja używana do pozyskiwania kontekstu urządzenia HDC w komunikacie WM_PAINT. Ta funkcja jest ściśle powiązana z funkcją EndPaint oraz z strukturą PAINTSTRUCT;
- CreateSolidBrush - funkcja używana do pozyskiwania uchwytu wypełnienia o określonym kolorze. Ta funkcja jest ściśle powiązana z typem COLORREF oraz makrem RGB;
- CreateWindow - funkcja używana do utworzenia nowego uchwytu okna o określonej nazwie klasy okna, która z kolei powiązana jest ściśle z funkcją RegisterClass oraz strukturą WNDCLASS;
- DefWindowProc - przekazuje nieobsłużone komunikaty dalej;
- DispatchMessage - rozpakowuje komunikaty;
- DrawText - wyświetla tekst rozmieszczając go w określonym prostokątnym obszarze;
- EndPaint - funkcja używana do zwolnienia kontekstu urządzenia HDC w komunikacie WM_PAINT. Ta funkcja jest ściśle powiązana z funkcją BeginPaint oraz z strukturą PAINTSTRUCT;
- GetMessage - przechwytuje komunikaty;
- LoadCursor - ładuje kursor (w tym projekcie domyślny);
- LoadIcon - ładuje ikonę (w tym projekcie domyślną);
- PostQuitMessage - funkcja kończąca żywot programu;
- RegisterClass - funkcja umożliwiająca rejestrowanie klasy okna. Funkcja jest ściśle powiązana z strukturą WNDCLASS;
- SetBkMode - ustawia tryb rysowania tekstu z tłem lub bez tła dla danego kontekstu urządzenia HDC;
- SetRect - funkcja ustawiająca pola struktury typu RECT;
- SetTextColor - funkcja ustawiająca kolor, jakim tekst będzie rysowany w danym kontekście urządzenia HDC;
- ShowWindow - funkcja wyświetla okno w określonym trybie (zminimalizowane, zmaksymalizowane ...);
- TranslateMessage - tłumaczy komunikaty;
- UpdateWindow - funkcja odświeża okno.
Lista struktur:
- MSG - struktura związana z pętlą komunikatów i przechwytywaniem komunikatów;
- PAINTSTRUCT - struktura związana z pozyskiwaniem kontekstu urządzenia w komunikacie WM_PAINT;
- WNDCLASS - struktura związana z rejestracją nowej klasy okna;