ďťż
Lemur zaprasza
Programowanie od podstaw (1) Siedzisz w wygodnym fotelu (lub krześle, mam nadzieję :) i 'rysujesz' program. Nie piszesz, ale 'rysujesz' bo w dzisiejszych czasach większość programów postrzegamy pod postacią graficzną i pod taką też chcemy je tworzyć. Takie tworzenie aplikacji - rysowanie jej interfejsu - nazywamy RAD. Nie chodzi tu o promieniotwórczy pierwiastek, ale o Rapid Appliacation Development. Niewiele nas to obchodzi, że można też tworzyć interfejs pisząc go i wiele się przy tym nauczyć. Możecie sobie pomyśleć, że to przestarzała technologia, ale do dziś się jej używa, dlaczego - bo jest uniwersalna dla każdego języka programowania, procedura zdarzeniowa zawsze ma takie parametry dla wszystkich środowisk, a zmienia się tylko składnia. Oczywiście, to wszystko jest skomplikowane, ale w rzeczywistości przypomina tworzenie 'zwyczajnego' programu. Jak oczywiście każdy z was (mam nadzieję) się domyślił będziemy korzystać z API. Dokładniej - z biblioteki User32.DLL, biblioteka ta pozwala na zarządzanie i wymianę komunikatów między oknami, ale o tym za chwilę. "Co będziemy musieli zrobić?" - to podstawowe pytanie, które należy zadać sobie przed przystąpieniem do pracy. A więc nasz program powinien stworzyć klasę okna. Tak, tak, dobrze widzisz. A po co, przecież tego nie robisz tworząc sobie normalną formę? Tak ci się tylko wydaje. Styl okna, ikona, kursor, tło, menu i wiele innych to właśnie klasa okna, którą ty tworzysz zawsze, nie zdając sobie z tego sprawy. Aby przekazać te dane do naszego okna, stworzymy jego klasę przesyłając do specjalnej funkcji API. Klasę rejestrujemy tylko raz dla każdego okna, i chociaż np. przycisk też traktujemy jako obiekt typu okna, to on posiada predefiniowaną klasę przycisku bez możliwości naszej ingerencji. Do funkcji RegisterClass, bo tak się nazywa, przekażemy zmienną o strukturze, która zawiera: Type WNDCLASS style As Long ' styl lpfnwndproc As Long 'wskaźnik procedury zdarzeniowej cbClsextra As Long cbWndExtra2 As Long hInstance As Long 'instancję obsługującej aplikacji hIcon As Long ' ikonę hCursor As Long ' kursor hbrBackground As Long ' kolor tła lpszMenuName As String ' nazwę menu lpszClassName As String ' nazwę klasy End Type Co dalej? Po zarejestrowaniu klasy wypadałoby utworzyć i pokazać okno. Robimy to za pomocą CreateWindowEx i ShowWindow. Po zakończeniu aplikacji trzeba odrejestrować klasę okna, by potem można by ją ponownie zarejestrować. Jak widzisz te czynności wykonujemy jeden raz i dlatego przykładowo nie da się zmienić niektórych parametrów okna podczas działania aplikacji. Została nam jeszcze do omówienia procedura zdarzeniowa. Czym ona jest? Co robi i po co jest? Jest ona wywoływana prze każdym zdarzeniu, takim jak utworzenie, zamknięcie, przesunięcie, czy zmiana wielkości okna (itd.), by nasz program mógł na to reagować. Musimy wiedzieć, że okno tworzone jest poza naszym programem, a my musimy zachować nad nim pełną kontrolę. Procedura zdarzeniowa w notacji języka C++ wygląda oto tak: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { return 0; } Widzimy parametry: hWnd - jest to zlepek handle + Window czyli uchwyt (numer identyfikacyjny) okna message - często także uMsg to jest chyba User + Message czyli wiadomość użytkownika, przesyłana jest jak coś się stanie wParam - jest to dodatkowa informacja do wiadomości uMsg (message); pierwszy jej parametr lParam - jak wyżej, tylko, że to jest jej drugi parametr. W notacji VB ta funkcja wygląda tak: Function WndProc(ByVal hWnd As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long End Function Widzimy, że wszystko tak samo (z programistycznego punktu widzenia). Jeżeli masz jeszcze niedosyt wiedzy, lub niezbyt to rozumiesz, to odsyłam do artykułu Karola Kuczmarskiego pt. "Jak działa Windows" z VBM #12, #13, #14... W następnej części artykułu przejdziemy do praktyki - utworzymy okno, bez jego rysowania. Artykuł zainspirowany . Marcin Porębski ( Doogie ) |