Stronę tą wyświetlono już: 2335 razy
Sporą wadą WinApi jest fakt, że obsługa kontrolek wymaga znajomości wielu funkcji obsługi okien oraz komunikatów i styli wpływających na wygląd tychże kontrolek. Nie ma tutaj również mowy o obiektowym tworzeniu kontrolek. Można jednak samemu napisać sobie klasy, które umożliwią łatwe obsłużenie tworzenia kontrolek, sterowania ich zachowaniem oraz wyglądem. Z tego właśnie powodu utworzyłem sobie mały zbiór klas, które umożliwiają mi dynamiczne tworzenie kontrolek oraz łatwy dostęp do opcji nimi sterujących oraz możliwość podpinania obiektów klas odpowiedzialnych za realizację zadań wywoływanych przez notyfikacje wysyłane przez daną kontrolkę do okna rodzica.
Oto lista klas do obsługi podstawowych kontrolek:
- WndLabel - klasa odpowiedzialna za tworzenie i obsługę notyfikacji kontrolki static;
- WndEdit - klasa odpowiedzialna za tworzenie i obsługę notyfikacji kontrolki edit;
- WndButton - klasa odpowiedzialna za tworzenie i obsługę notyfikacji kontrolki button;
- WndScrollBar - klasa odpowiedzialna za tworzenie i obsługę notyfikacji kontrolki scrollbar;
- WndListBox - klasa odpowiedzialna za tworzenie i obsługę notyfikacji kontrolki listbox;
- WndComboBox - klasa odpowiedzialna za tworzenie i obsługę notyfikacji kontrolki combobox;
- WndTooltip - klasa odpowiedzialna za tworzenie i obsługę notyfikacji kontrolki tooltip służącej do wyświetlania podpowiedzi/opisów kontekstowych innych kontrolek.

Cały kod poszczególnych klas wraz z przykładem ich zastosowania zamieściłem na stronie GitHub. Jedynie pokażę jak można tworzyć kontrolki za ich pomocą. Oto jak tworzone są kontrolki w komunikacie WM_CREATE:
Ważnym elementem obsługi kontrolek w WinApi są notyfikacje, czyli komunikaty pochodzące od danej kontrolki wysyłane do okna rodzica. Mechanizm podpinania jest bardzo prosty i przytoczę tutaj jeden przykładowy wycinek z listing-u 1:
To co jest wykonywane w powyższym fragmencie kodu to podpinanie pod zdarzenie (notyfikację) typu selchange obiektu klasy OnComboBoxSelChanged. Klasa ta dziedziczy po specjalnie utworzonym interfejsie INotificationCommand, który dysponuje czysto wirtualną metodą notify. To ta metoda będzie wywoływana, gdy obiekt wyśle notyfikację do okna rodzica. Do obsługi więc notyfikacji konieczne jest utworzenie takiej klasy. Oto przykład:
Klasa OnComboBoxSelChanged przechowuje dane niezbędne do realizacji zadań wykonywanych w metodzie notify. Niestety samo podpięcie klasy nie wystarczy, trzeba jeszcze obsłużyć komunikat WM_COMMAND, gdzie lądują notyfikacje wysyłane przez okna potomne. Oto przykładowy kod:
Jak widać metoda notify wywołana w komunikacie WM_COMMAND wykonuje całą brudną robotę związaną z obsługą notyfikacji i zwraca wartość niezerową, gdy notyfikacja została obsłużona.