Podstawowe klasy okien systemu Windows

Stronę tą wyświetlono już: 329 razy

Wstęp

W systemie Windows stosowane są pewne podstawowe typy zarejestrowanych klas okien, które można utworzyć korzystając z znanej już funkcji CreateWindow. W funkcji tej pierwszy parametr przyjmuje łańcuch znaków opisujący nazwę klasy zarejestrowanego już wcześniej okna. Oto lista podstawowych nazw klas okien, z których można korzystać:

  • BUTTON - przycisk, który może być użyty w grupie;
  • COMBOBOX - kontrolka wyboru z rozwijanej listy;
  • EDIT - kontrolka tekstowa (już wcześniej użyta w projekcie myNotepad);
  • LISTBOX - kontrolka zawierająca listę możliwych do wyboru opcji;
  • MDICLIENT - klasa okna związana z obsługą wielodokumentowego interfejsu;
  • RichEdit - rozwinięta kontrolka tekstu, która umożliwia bardziej zaawansowane formatowanie tekstu w niej wyświetlanego;
  • RICHEDIT_CLASS - nowsza wersja "RichEdit";
  • SCROLLBAR - pasek przewijania;
  • STATIC - proste pole tekstowe umożliwiające grupowanie innych kontrolek

Każde z wyżej wymienionych nazw klas okien ma swoje własne dodatkowe style, które mogą być użyte wraz z standardowymi stylami okna zawierającymi przedrostek . Na tej stronie omówię nieco sposób tworzenia i podstawę obsługi tylko niektórych z powyższych klas okien.

Podczas tworzenia uchwytu okna danej klasy (które najczęściej jest oknem potomnym) należy zamiast parametru HMENU podać unikalny identyfikator okna, który będzie przekazywany w komunikacie WM_COMMAND jako niższe słowo parametru wParam użytego w funkcji obsługi komunikatów okna rodzica.

Kontrolka klasy "BUTTON"

Flagi stylów kontrolki

Przyciski należą do jednych z najprostszych okien, ich zadanie jest również proste: reakcja na kliknięcie lub zmiana jakiegoś tanu ustawienia. Co ciekawe w zależności od użytego stylu wewnętrznego tej kontrolki można uzyskać zupełnie inne jej wersje i funkcjonalności. Oto kilka przykładowych flag stylów, które wpływają w ten sposób na wygląd tej kontrolki:

  • BS_PUSHBUTTON - zwykły wciskany przycisk;
  • BS_PUSHLIKE - przycisk wciskany, który może działać jak checkbox lub radiobutton z tą różnicą, że ma wygląd zwykłego przycisku. Przycisk rysuje się w dwóch wersjach w zależności, czy został ustawiony jako BST_CHECKED czy BST_UNCHECKED;
  • BS_CHECKBOX - pole wielokrotnego wyboru checkbox;
  • BS_RADIOBUTTON - pole jednokrotnego wyboru radiobutton;
  • BS_GROUPBOX - pole grupujące inne kontrolki przycisków
  • BS_OWNERDRAW - przycisk rysowany przez programistę ręcznie, ten styl nie może być użyty z innymi stylami przycisku i powoduje on wysyłanie komunikatu WM_DRAWITEM do okna rodzica

Zgrupowanie kontrolek typu radiobutton sprawia, że tylko jedno pole wyboru jest możliwe do zaznaczenia.

Możliwe do wysłania komunikaty

Kontrolka przycisku przetwarza pewne komunikaty, które można do niej wysłać ręcznie za pomocą funkcji SendMessage uzyskując możliwość pozyskiwania lub ustawiania pewnych właściwości tej kontrolki w trakcie działania programu, oto lista niektórych z nich:

  • BCM_GETIDEALSIZE - umożliwia pozyskiwanie informacji o najlepszym rozmiarze pasującym do zawartości kontrolki;
  • BM_CLICK - symuluje kliknięcie przycisku, w wyniku czego okno rodzica kontrolki otrzymuje komunikat z notyfikacją BN_CLICKED;
  • BM_GETCHECK - zwraca informację o stanie przycisku: BTS_CHECKED lub BTS_UNCHECKED;
  • BM_GETIMAGEM - zwraca uchwyt do bitmapy, który został powiązany z kontrolką;
  • BM_GETSTATE - pobiera informację o stanie przycisku (style oraz czy przycisk jest wciśnięty, czy nie);
  • BM_SETCHECK - ustawia stan przycisku radio button lub checkbox button bez wysyłania komunikatu notyfikacji do okna rodzica;
  • BM_SETDONTCLICK - ustawia stan flagi BST_DONTCLICK;
  • BM_SETIMAGE - umożliwia ustawienie uchwytu do bitmapy, która będzie rysowana w przycisku;
  • BM_SETSTATE - umożliwia ustawienie stanu kontrolki (wciśnięty / nie wciśnięty);
  • BM_SETSTYLE - umożliwia ustawienie stanu kontrolki (style + czy przycisk jest wciśnięty, czy nie);

Wysyłane notyfikacje do okna rodzica

No i pytanie, co to są te notyfikacje? Są to obowiązkowe powiadomienia, jakie dane okno potomne jest zobowiązane wysłać do okna rodzica w celu przekazania pewnej konkretnej informacji. A jaka to może być ta konkretna informacja? A no na przykład w przypadku przycisku to chciałoby się otrzymać jakąś informację, że ten przycisk został wciśnięty. Teraz pozostaje pytanie jaki komunikat i w jaki sposób przesyłać te notyfikacje? Tym komunikatem jest komunikat WM_COMMAND, który jako parametr lParam otrzymuje uchwyt kontrolki, od której notyfikacja przychodzi, natomiast sam identyfikator informujący o zajściu tak podniosłego zdarzenia jakim jest wciśnięcie przycisku jest zawarty w wyższym słowie parametru wParam. Pozostało oczywiście jeszcze wyższe słowo tegoż parametru, które zawiera identyfikator kontrolki.

Oto lista notyfikacji, jakie wysyła kontrolka przycisku do okna rodzica:

  • BN_CLICKED - przycisk wciśnięty;
  • BN_DBLCLK - podwójne kliknięcie przycisku;
  • BN_DISABLE - gdy przycisk jest dezaktywowany;
  • BN_DISABLE - gdy przycisk jest dezaktywowany;
  • BN_HILITE - gdy użytkownik zaznaczy przycisk;
  • BN_KILLFOCUS - gdy przycisk straci fokus (otrzymywanie komunikatów przychodzących z klawiatury);
  • BN_PAINT - gdy przycisk musi zostać odrysowany;
  • BN_PUSHED - gdy przycisk został wciśnięty;
  • BN_SETFOCUS - gdy przycisk otrzymał fokus;
  • BN_UNPUSHED - gdy przycisk gdy przycisk został wyciśnięty;
  • BN_UNPUSHED - gdy przycisk gdy przycisk został wyciśnięty;

I na koniec notyfikacja, która jest tak naprawdę komunikatem otrzymywanym przez okno rodzica:

  • WM_CTLCOLORBTN - komunikat wysyłany zanim okno zostanie odrysowane w celu możliwości ustawienia koloru czcionki oraz tła.

Kontrolka klasy "COMBOBOX"

Flagi stylów kontrolki

Okno typu combobox jest to okno wyboru (pojedynczego), które wyposażone jest w rozwijaną listę wyboru. Poniżej zamieszczam niektóre flagi dostępnych stylów tego okna:

  • CBS_AUTOHSCROLL - automatyczne przesuwanie tekstu, gdy ten osiągnie koniec okna kontrolki, w przypadku nie ustawienia tej flagi możliwość wprowadzania tekstu ogranicza się do obszaru okna;
  • CBS_DISABLENOSCROLL - pokazuje nieaktywny pasek przewijania w liście rozwijanej, gdy ta zawiera zbyt mało elementów by nie mieściły się one na liście, bez tego stylu pasek przewijania jest w takim przypadku ukrywany;
  • CBS_DROPDOWN - tworzy rozwijaną listę wyboru;
  • CBS_LOWERCASE - zamienia tekst w liście oraz polu wyboru na małe literki;
  • CBS_NOINTEGRALHEIGHT - ustawia wymiar okna na taki, jaki został ustawiony podczas jego tworzenia, normalnie system zmienia rozmiar okna, tak że nie wyświetla części elementów;
  • CBS_OWNERDRAWFIXED - ustawia odpowiedzialność za odrysowanie zawartości i listy na rodzica okna kontrolki. Okno rodzic otrzymuje komunikat WM_MEASUREITEM gdy okno combobox jest tworzone oraz WM_DRAWITEM gdy konieczne jest odrysowanie listy kontrolki;
  • CBS_SIMPLE - wyświetla okno listy wyboru cały czas;
  • CBS_SORT - automatycznie sortuje tekst dodany do listy okna;
  • CBS_UPPERCASE - zamienia litery w liście wyboru oraz na rozwijanej liście na duże.

Możliwe do wysłania komunikaty

Oto lista flag komunikatów, jakie można wysyłać do okna typu combobox w celu pozyskiwania lub zmiany ustawień okna za pomocą funkcji SendMessage:

  • CB_ADDSTRING - dodawanie tekstu do listy, jeżeli styl CBS_SORT został ustawiony, to wstawianie odbywa się z automatycznym sortowaniem, w przeciwnym przypadku dodawany element jest na końcu listy rozwijanej;
  • CB_DELETESTRING - usuwa dany element tekstowy z listy rozwijanej;
  • CB_FINDSTRING - znajduje element listy wyboru, którego początkowe litery pasują do tekstu przekazanego w parametrze lParam;
  • CB_FINDSTRINGEXACT - znajduje element listy, który dokładnie pasuje do podanego w parametrze lParam;
  • CB_GETCOMBOBOXINFO - umożliwia pozyskanie informacji o ustawieniach okna;
  • CB_GETCOUNT - zwraca liczbę elementów listy;
  • CB_GETCUEBANNER - pobiera tekst wyświetlany w części okna wyboru kontrolki combobox;
  • CB_GETCURSEL - pozyskiwanie indeksu wybranego elementu listy, jeżeli żaden nie został wybrany to zwracana wartość jest równa CB_ERR;
  • CB_GETDROPPEDCONTROLRECT - umożliwia pozyskanie informacji o rozmiarze obszaru okna zajmowanym przez nie w trybie z rozwiniętą listą;
  • CB_GETDROPPEDSTATE - zwraca prawdę, gdy lista rozwijana okna jest widoczna, fałsz w przeciwnym razie
  • CB_GETDROPPEDWIDTH - zwraca długość listy rozwijanej w pikselach okna combo_box utworzonego z stylem CBS_DROPDOWN;
  • CB_GETEDITSEL - zwraca początek i koniec zaznaczonego tekstu w oknie edycji kontrolki;
  • CB_GETEXTENDEDUI - określa, czy pole rozwijane ma domyślny interfejs użytkownika czy rozbudowany interfejs użytkownika;
  • CB_GETHORIZONTALEXTENT - zwraca długość w pikselach, na którą lista wyboru może być przewijana;
  • CB_GETITEMDATA - pobiera tekst przypisany do danego pola wyboru;
  • CB_GETITEMHEIGHT - pobiera wysokość listy elementów w polu wyboru;
  • CB_GETLBTEXT - pobiera tekst z okna listy;
  • CB_GETLBTEXTLEN - pobiera długość tekstu wyświetlanego w liście;
  • CB_GETLOCALE - pobiera ustawienia lokalne dla okna, które mają wpływ na dodawanie elementów do listy w przypadku zastosowania stylu CBS_SORT;
  • CB_GETMINVISIBLE - pobiera minimalną liczbę elementów, które są widoczne w liście wyboru;
  • CB_GETTOPINDEX - pobiera indeks pierwszego widocznego elementu w polu listy (gdy pole nie jest przewinięte pierwszym element będzie miał indeks równy 0, ale jeżeli lista została przewinięta, to pierwszy widoczny element listy będzie miał inny index);
  • CB_INITSTORAGE - inicjalizacja pamięci dla wielu elementów dodawanych do listy;
  • CB_INSERTSTRING - dodaje element na końcu listy, nawet gdy styl CBS_SORT jest ustawiony;
  • CB_LIMITTEXT - ograniczenie liczby znaków, jaką użytkownik może wprowadzić w polu edycji;
  • CB_RESETCONTENT - usuwa wszystkie elementy z listy i pola edycji;
  • CB_SELECTSTRING - przeszukuje listę pola wyboru dla elementu, który rozpoczyna się od znaków w określonym ciągu. Jeśli element zostanie znaleziony, zostanie on wybrany i skopiowany do pola edycyjnego;
  • CB_SETCUEBANNER - ustawia tekst w polu edycji;
  • CB_SETCURSEL - wysyłany by ustawić zaznaczenie w polu wyboru;
  • CB_SETDROPPEDWIDTH - ustawia maksymalną dostępną długość okna listy wyboru ustawionej z stylem CBS_DROPDOWN;
  • CB_SETEDITSEL - wysłanie tego komunikatu umożliwia zaznaczenie określonego zakresu znaków tekstu z pola edycji;
  • CB_SETEXTENDEDUI - ustawia domyślny widok kontrolki, lub rozwinięty (dostępne dla stylu CBS_DROPDOWN;
  • CB_SETHORIZONTALEXTENT - określa szerokość w jakiej okno listy może byś przewijane horyzontalnie;
  • CB_SETITEMDATA - ustawia zawartość tekstową określonego elementu listy;
  • CB_SETITEMHEIGHT - wysyłany by ustawić wysokość listy elementów;
  • CB_SETLOCALE - wprowadza możliwość wprowadzenia ustawień lokalnych, które mają wpływ na dodawanie elementów do listy, gdy ustawiony został styl CBS_SORT;
  • CB_SETMINVISIBLE - ustawia minimalną liczbę elementów widocznych w polu listy;
  • CB_SETTOPINDEX - ustawia wybrany indeks listy tak, aby był on widoczny;
  • CB_SHOWDROPDOWN - rozwija ukryte pole listy wyboru (działa dla stylu okna CBS_DROPDOWN;

Wysyłane notyfikacje do okna rodzica

Oto lista notyfikacji wysyłanych do okna rodzica kontrolki w komunikacie WM_COMMAND:

  • CBN_CLOSEUP - wysyłany, gdy lista wyboru została zwinięta;
  • CBN_SELCHANGE - wysyłany, gdy użytkownik zmienił pozycję wyboru na liście elementów;
  • CBN_SELENDCANCEL - wysyłany, gdy użytkownik zaznaczył element, lecz później przeszedł do innego okna lub zamknął okno rodzica;
  • CBN_SELENDOK - wysyłany, gdy użytkownik zaznaczył element na liście a następnie ją zamknął;
  • CBN_SETFOCUS - wysyłany, gdy okno otrzyma fokus;

Lista komunikatów wysyłanych bezpośrednio do okna rodzica:

  • WM_COMPAREITEM - wysyłany gdy dodawany jest element do listy wyboru w celu samodzielnego obsłużenia sortowania. Ten komunikat jest ważny tylko dla stylu okna CBS_SORT;
  • WM_DRAWITEM - wysyłany, gdy okno wymaga odrysowania;
  • WM_MEASUREITEM - wysyłany, gdy okno jest tworzone;

Konstrolka typu "EDIT"

Flagi stylów kontrolki

Okno typu edit było już użyte w projekcie prostego i dość ubogiego w funkcjonalność notatnika, jednakże nie omówiłem tam szczegółów dotyczących możliwych stylów tego typu okna, co też i tutaj z najdzikszą wręcz rozkoszą czynię:

  • ES_AUTOHSCROLL - automatyczne przesuwanie tekstu, gdy ten nie mieści się w oknie;
  • ES_AUTOVSCROLL - automatyczne przesuwanie tekstu, gdy ten nie mieści się w poziomie;
  • ES_CENTER - wypośrodkowuje tekst zawarty w kontrolce tekst;
  • ES_LEFT - wyrównanie tekstu do lewej (domyślne ustawienie);
  • ES_LOWERCASE - umożliwia wpisywanie tylko małych liter (duże zamienia na małe);
  • ES_MULTILINE - umożliwia wpisywanie tekstu wieloliniowego;
  • ES_NUMBER - umożliwia wpisywanie jedynie cyfr, warto pamiętać, że istnieje wciąż możliwość wklejenia tekstu, który zawiera inne znaki;
  • ES_PASSWORD - wyświetla gwiazdki * w celu ukrycia wpisywanego hasła;
  • ES_READONLY - uniemożliwia wpisywanie lub zmianę tekstu zawartego w kontrolce;
  • ES_RIGHT - wyrównuje tekst do prawej strony;
  • ES_UPPERCASE - możliwe jest wpisywanie tylko dużych liter;
  • ES_WANTRETURN - ustawia enter jako znak przejścia do nowej linii, co jest konieczne w przypadku okien dialogowych, gdzie wciśnięcie entera powoduje zamknięcie okna.

Możliwe do wysłania komunikaty

Dostępna jest następująca lista komunikatów, jakie można wysłać do tego typu okna za pomocą funkcji SendMessage:

  • EM_CANUNDO - określa, czy są jakieś działania w kolejce cofania zmiany wpisanego tekstu w oknie;
  • EM_CHARFROMPOS - określa położenie w tekście wyświetlanym najbliższej względem podanego punktu litery;
  • EM_EMPTYUNDOBUFFER - resetuje flagę cofania kontrolki edit. Flaga cofania jest ustawiona, gdy operacje pod kontrolką edit można cofnąć;
  • EM_FMTLINES - ustawia flagę, która określa, czy dana kontrolka edit wieloliniowego tekstu obejmuje miękkie znaki line-break. Miękki podział wiersza składa się z dwóch znaków: powrotu karetki i przesunięcia wiersza i jest wstawiany na końcu wiersza, który jest łamany z powodu zawijania tekstu;
  • EM_GETCUEBANNER - pobiera tekst, który jest wyświetlany jako wskazówka tekstowa lub końcówka w kontrolce edit;
  • EM_GETFIRSTVISIBLELINE - zwraca indeks najwyżej położonej linii tekstu w kontrolce, dla ustawionego stylu ES_MULTILINE;
  • EM_GETHANDLE - pobiera uchwyt do pamięci obecnie zadeklarowanej dla wieloliniowego okna kontrolki edit;
  • EM_GETIMESTATUS pobiera ustawnienia stanu flag określających jak kontrolka edit współdziała z IME (Input Method Editor);
  • EM_GETLIMITTEXT - zwraca maksymalną dostępną długość tekstu możliwego do wpisania;
  • EM_GETLINE - kopiuje linię tekstu i wstawia go do bufora;
  • EM_GETLINECOUNT - zwraca liczbę linii tekstu zawartego w kontrolce;
  • EM_GETMARGINS - zwraca długość marginesów z lewej i prawej strony kontrolki;
  • EM_GETMODIFY - pobiera stan flag sterujących okna edit. Flaga wskazuje, czy zawartość pola edycyjnego została zmodyfikowana;
  • EM_GETPASSWORDCHAR - pobiera tekst hasła;
  • EM_GETRECT - zwraca prostokąt, w którym tekst jest wyświetlany, wymiary tego prostokąta są niezależne od rozmiaru okna;
  • EM_GETSEL - pobiera pozycję początku i końca zaznaczenia tekstu;
  • EM_GETTHUMB - pobiera pozycję pionowego paska przewijania;
  • EM_LIMITTEXT - ustawia maksymalną długość tekstu, jaki może zostać wprowadzony;
  • EM_LINEFROMCHAR - pobiera indeks linii tekstu, która zawiera określony ciąg znaków;
  • EM_LINEINDEX - pobiera indeks linii tekstu, w której początkowe litery zgadzają się z podanym ciągiem znaków;
  • EM_LINELENGTH - pobiera długość w literach linii tekstu zawartego w kontrolce;
  • EM_LINESCROLL - przewija tekst w wieloliniowym trybie kontroli edit;
  • EM_POSFROMCHAR - zwraca położenie w oknie określonej litery tekstu w kontrolce;
  • EM_REPLACESEL - zamienia zaznaczony ciąg znaków w kontrolce na inny;
  • EM_SCROLL - przesuwa tekst poziomo w trybie wieloliniowym kontrolki edit;
  • EM_SCROLLCARET - przesuwa karetkę klawiatury tak, aby ta była widoczna w obszarze okna;
  • EM_SETCUEBANNER - ustawia tekstową wskazówkę, która jest wyświetlana przez kontrolę edit, aby poinformować użytkownika;
  • EM_SETHANDLE - ustawia uchwyt do pamięci, która będzie użyta przez wieloliniową kontrolkę edycji;
  • EM_SETIMESTATUS - ustawia stan flag, które determinują jak kontrolka edit współdziała z IME;
  • EM_SETLIMITTEXT - ustawia maksymalną długość tekstu, jaki można wprowadzić do kontrolki;
  • EM_SETMARGINS - ustawia margines prawy i lewy tekstu;
  • EM_SETMODIFY - ustawia lub czyści flagę modyfikacji dla kontrolki edit. Flaga ta określa, czy tekst w kontrolce został zmodyfikowany.
  • EM_SETPASSWORDCHAR - ustawia lub usuwa tekst hasła w kontrolce;
  • EM_SETREADONLY - ustawia lub usuwa styl ES_READONLY;
  • EM_SETRECT ustawia formatujący prostokąt dla wieloliniowego tekstu w kontrolce edit. Prostokąt określa granice prostokąta, w którym tekst jest rysowany i jest on niezależny od rozmiaru okna;
  • EM_SETSEL - ustawia zaznaczenie tekstu;
  • EM_SETTABSTOPS - ustawia tabulatory w wieloliniowym tekście kontrolki;
  • EM_UNDO - cofa ostatnio wprowadzone zmiany w tekście;
  • WM_UNDO - ponawia ostatnio wycofane zmiany w tekście.

Wysyłane notyfikacje do okna rodzica

Oto lista notyfikacji, które są wysyłane do okna rodzica w komunikacie WM_COMMAND:

  • EN_ALIGN_LTR_EC - wysyłany, gdy użytkownik zmienił kierunek wyrównania tekstu z do lewej na do prawej strony okna;
  • EN_ALIGN_RTL_EC - wysyłany, gdy użytkownik zmienił kierunek wyrównania tekstu z do prawej na do lewej strony okna;
  • EN_CHANGE - komunikat wysyłany, gdy użytkownik wprowadził zmiany w tekście;
  • EN_ERRSPACE - komunikat wysyłany, gdy kontrolka nie może zarezerwować wystarczającej ilości pamięci w celu wykonania określonego działania;
  • EN_HSCROLL - wysyłany, gdy użytkownik kliknie poziomy pasek przewijania;
  • EN_KILLFOCUS - wysyłany, gdy okno straci fokus;
  • EN_MAXTEXT - wysyłany, gdy tekst wprowadzony do kontrolki osiągnął maksymalną dopuszczalną wielkość;
  • EN_SETFOCUS - wysyłany, gdy kontrolka odzyskuje fokus;
  • EN_UPDATE - wysyłany, gdy kontrolka musi zostać odrysowana;
  • EN_VSCROLL - wysyłany, gdy poziomy pasek przewijania został kliknięty;

Komunikat wysyłany bezpośrednio do okna rodzica:

  • WM_CTLCOLOREDIT - wysyłany zanim kontrolka zostanie odrysowana, dzięki temu komunikatowi można zmienić kolor tekstu oraz kolor tła kontrolki;

Kontrolka klasy "LISTBOX"

Flagi stylów kontrolki

Lista stylów kontrolki typu list box, które użyte w funkcji CreateWindow wpływają na wygląd bądź funkcjonalność kontrolki:

  • LBS_DISABLENOSCROLL - pokazuje zablokowany poziomy pasek przewijania gdy lista elementów nie wykracza poza obszar okna, jeżeli ten styl nie jest sprecyzowany wtedy pasek przewijania jest automatycznie ukrywany;
  • LBS_EXTENDEDSEL - umożliwia zaznaczanie wielu elementów z wciśniętym klawiszem shift wraz z kliknięciem myszką;
  • LBS_HASSTRINGS - określa, że listbox zawiera elementy, które składają się z tekstu. W polu listy podtrzymuje pamięć i adresy do łańcucha znaków, dzięki czemu aplikacja może używać wiadomość LB_GETTEXT aby pobrać tekst dla danego elementu;
  • LBS_MULTICOLUMN - określa listę jako wielokolumnową, która może być przewijana w poziomie. Komunikat LB_SETCOLUMNWIDTH ustawia szerokość kolumn;
  • LBS_MULTIPLESEL - włącza i wyłącza zaznaczenie danego elementu listy poprzez kliknięcie lub podwójne kliknięcie danego elementu. Użytkownik może zaznaczyć dowolną liczbę elementów;
  • LBS_NODATA - określa pole listy bez danych. Należy użyć tego stylu, gdy liczba elementów w polu listy przekroczy tysiąc. Pole listy bez danych musi mieć ustawiony styl LVS_OWNERDRAWFIXED, ale nie musi mieć ustawionego stylu LBS_SORT lub LBS_HASSTRINGS. System wysyła wiadomość WM_DRAWITEM do okna właściciela, gdy elementy listy muszą zostać sporządzone. Człon itemID struktury DRAWITEMSTRUCT wysyłany z komunikatem WM_DRAWITEM określa numer wiersza elementu, który ma zostać sporządzony. Pole listy bez danych nie wysyła wiadomości WM_DELETEITEM;
  • LBS_NOINTEGRALHEIGHT - określa, że rozmiar kontrolki jest taki sam jak ustawiony przez aplikację gdy kontrolka została utworzona. Normalnie system zmienia rozmiar, tak aby w oknie mieściła się maksymalna liczba elementów listy w całości (bez ucinania);
  • LBS_NOREDRAW - określa, że kontrolka nie jest odświeżana, gdy nastąpi w niej jakaś zmiana. By zmienić ustawienie odrysowywania kontrolki użyj komunikatu WM_SETREDRAW;
  • LBS_NOSEL - określa, że kontrolka zawiera elementy, które można jedynie oglądać, ale nie można ich zaznaczać;
  • LBS_NOTIFY - wysyła notyfikację do okna rodzica za każdym razem, gdy użytkownik kliknie lub podwójnie kliknie tekst w kontrolce;
  • LBS_OWNERDRAWFIXED - określa odpowiedzialność okna rodzica za odrysowanie zawartości oraz elementów kontrolki. Okno rodzica otrzymuje komunikat WM_MEASUREITEM gdy kontrolka jest tworzona i WM_DRAWITEM gdy kontrolka musi zostać odrysowana;
  • LBS_OWNERDRAWVARIABLE - określa odpowiedzialność okna rodzica za odrysowanie zawartości oraz elementów kontrolki. Okno rodzica otrzymuje komunikat WM_MEASUREITEM gdy kontrolka jest tworzona i WM_DRAWITEM gdy kontrolka musi zostać odrysowana;
  • LBS_SORT - srtuje dodawane elementy alfabetycznie;
  • LBS_STANDARD - sortuje dodawane elementy alfabetycznie. Okno rodzica otrzymuje komunikat za każdym razem, gdy użytkownik kliknie lub podwójnie kliknie daną pozycję. Kontrolka otrzymuje obramowanie dookoła;
  • LBS_WANTKEYBOARDINPUT - okno rodzica kontrolki otrzymuje komunkat WM_VKEYTOITEM za każdym razem gdy wciśnięty zostanie przycisk i lista ma przypisany fokus.

Możliwe do wysłania komunikaty

Oto lista komunikatów, jakie można wysłać do okna w celu zmiany jego zachowania, wyglądu lub pozyskania informacji o nim:

  • LB_ADDFILE - dodaje specyficzną nazwę pliku do kontrlki, który zawiera listę informacji;
  • LB_ADDSTRING - dodaje tekst do kontrolki. Jeżeli kontrolka nie ma ustawionego stylu LBS_SORT wtedy tekst jest dodawany na końcu listy, w przeciwnym przypadku lista jest sortowana alfabetycznie;
  • LB_DELETESTRING - usuwa tekst z listy kontrolki;
  • LB_DIR - dodaje nazwy do wyświetlanej listy w kontrolce. Komunikat dodaje nazwy katalogów i plików, które pasują do określonego ciągu i zestaw atrybutów plików. LIB_DIR można również dodać mapowane litery dysków w polu listy.
  • LB_FINDSTRING - znajduje pierwszy element na liście zawartej w kontrolce, który zaczyna się od podanego ciągu znaków;
  • LB_FINDSTRINGEXACT - znajduje pierwszy element na liście zawartej w kontrolce, który pasuje do określonego ciągu znaków, oprócz tego wyszukiwarka nie uwzględnia wielkości liter;
  • LB_GETANCHORINDEX - pobiera indeks zakotwiczonego elementu;
  • LB_GETCARETINDEX - ustawia indeks elementu, który ma fokus zaznaczony prostokątem w kontrolce z wieloelementowym trybem zaznaczania. Element może ale nie musi być zaznaczony;
  • LB_GETCOUNT - zwraca liczbę elementów listy w kontrolce;
  • LB_GETCURSEL - zwraca index obecnie zaznaczonego elementu, jeżeli jakiś jest zaznaczony jako pojedynczy w kontrolce;
  • LB_GETHORIZONTALEXTENT - pobiera szerokość w pikselach, na jaką kontrolka może być przewijana poziomo, jeżeli kontrolka ma pasek przewijania;
  • LB_GETITEMDATA - pobiera wartość zdefiniowaną przez aplikację a powiązaną z określoną pozycję na liście kontrolki;
  • LB_GETITEMHEIGHT - pobiera wysokość elementów zawartych w kontrolce;
  • LB_GETITEMRECT - pobiera prostokąt elementów zawartych w kontrolce;
  • LB_GETLISTBOXINFO - pobiera liczbę elementów w danej kolumnie w kontrolce;
  • LB_GETLOCALE - pobiera obecne ustawienia lokalne dla kontrolki, które mają wpływ na sposób dodawania elementów do listy gdy styl LBS_SORT jest ustawiony;
  • LB_GETSEL - pobiera obecny stan zaznaczenia elementów listy;
  • LB_GETSELCOUNT - pobiera liczbę zaznaczonych elementów;
  • LB_GETSELITEMS - wypełnia bufor tablicą typu int, która określa mumery elementów zaznaczonych w trybie wieloelementowego zaznaczania;
  • LB_GETTEXT - pobiera tekst z kontrolki;
  • LB_GETTEXTLEN - pobiera długość tekstu;
  • LB_GETTOPINDEX - pobiera indeks pierwszego widocznego w oknie elementu;
  • LB_INITSTORAGE - rezerwuje pamięć do przechowywania elementów listy. Tego komunikatu używa się zanim aplikacja doda większa liczbę elementów do kontrolki;
  • LB_INSERTSTRING - dodaje tekst do kontrolki bez sortowania;
  • LB_ITEMFROMPOINT - zwraca indeks elementu znajdującego się najbliżej podanego punktu w kontrolce;
  • LB_RESETCONTENT - usuwa wszystkie elementy;
  • LB_SELECTSTRING - przeszukuje elementy listy kontrolki w poszukiwaniu elementu zaczynającego się od podanego ciągu znaków, jeżeli dopasowanie zostanie odnalezione, to element zostaje zaznaczony;
  • LB_SELITEMRANGE - umożliwia zaznaczenie jednego lub większej liczby elementów listy;
  • LB_SELITEMRANGEEX - umożliwia zaznaczenie jednego lub większej liczby następujących po sobie elementów listy;
  • LB_SETANCHORINDEX - ustawia element kotwiczący;
  • LB_SETCARETINDEX - ustawia prostokąt fokusa dla elementu o określonym indeksie;
  • LB_SETCOLUMNWIDTH - ustawia szerokość w pikselach wszystkich kolumn w liście;
  • LB_SETCOUNT - - ustawia liczbę elementów w liście kontrolki utworzonej z stylem LBS_NODATA oraz bez stylu LBS_HASSTRING;
  • LB_SETCURSEL - zaznacza element i ustawia tak listę, aby ten był widoczny w oknie;
  • LB_SETHORIZONTALEXTENT - ustawia szerokość w pikselach, na jaką kontrolka ta może być przewijana poziomo;
  • LB_SETITEMDATA - umożliwia ustawienie wartości określonego elementu listy;
  • LB_SETITEMHEIGHT - ustawia wysokość w pikselach elementów w liście. Jeżeli kontrolka ma włączony styl LBS_OWNERDRAWVARIABLE ten komunikat ustawia wysokość elementu określonego przez wParam w przeciwnym przypadku ustawia wysokość wszystkich elementów listy;
  • LB_SETLOCALE - zmienia ustawienia lokalne w kontrolce, które mają wpływ na sposób dodawania elementów do listy;
  • LB_SETSEL - umożliwia zaznaczenie wielu elementów listy;
  • LB_SETTOPINDEX - ustawia dany element listy, tak aby był widoczny w obszarze kontrolki.

Wysyłane notyfikacje do okna rodzica

Lista notyfikacji wysyłanych do okna rodzica w komunikacie WM_COMMAND:

  • LBN_DBLCLK - wysyłany przy podwójnym kliknięciu tekstu na liście kontrolki;
  • LBN_ERRSPACE - wysyłany gdy kontrolka nie może zarezerwować odpowiedniej ilości pamięci by wykonać daną operację;
  • LBN_KILLFOCUS - wysyłany, gdy kontrolka traci fokus;
  • LBN_SELCANCEL - wysyłany, gdy użytkownik cofnie zaznaczenie elementów w kontrolce;
  • LBN_SELCHANGE - wysyłany, gdy stan zaznaczenie elementów listy ulegnie zmianie;
  • LBN_SETFOCUS - wysyłany, gdy kontrolka otrzyma fokus;
  • WM_CHARTOITEM - wysyłany przez kontrolkę, gdy styl LBS_WANTKEYBOARDINPUT w odpowiedzi na komunikat WM_CHAR;
  • WM_CTLCOLORLISTBOX - wysyłany przed odrysowaniem obszaru kontrolki, by możliwe było zmienienie koloru tła i tekstu;
  • WM_DELETEITEM - wysyłany, gdy okno kontrolki jest niszczone lub element listy jest usuwany za pomocą komunikatów: LB_DELETESTRING lub LB_RESETCONTENT;
  • LB_DELETESTRING - wysyłany przez kontrolkę z ustawionym stylem LBS_WANTHEYBOARDINPUT jako odpowiedź na komunikat WM_KEYDOWN;

Kontrolka klasy "SCROLLBAR"

Flagi stylów kontrolki

Lista flag stylów, jakie kontrolka może użyć w funkcji CreateWindow by wpłynąć na swój wygląd lub zachowanie:

  • SBS_BOTTOMALIGN - wyrównuje dolną krawędź paska przewijania z dolną krawędzią prostokąta zdefiniowanego przez x, y, szerokość, wysokość i parametry funkcji CreateWindow. Pasek przewijania ma domyślną wysokość systemowych pasków przewijania. Tego stylu należy używać z stylem SBS_HORZ;
  • SBS_HORZ określa poziomy pasek przewijania;
  • SBS_LEFTALIGN - wyrównuje lewą krawędź paska przewijania z lewą krawędzią prostokąta zdefiniowanego przez parametry x, y, szerokości i wysokości parametrów funkcji CreateWindow. Kontrolka ma domyślną szerokość systemowego paska przewijania. Tego stylu należy używać z stylem SBS_VERT;
  • SBS_RIGHTALIGN - wyrównuje prawą krawędź paska przewijania z prawą krawędzią prostokąta zdefiniowanego przez parametry x, y, szerokości i wysokości parametrów funkcji CreateWindow. Kontrolka ma domyślną szerokość systemowego paska przewijania. Tego stylu należy używać z stylem SBS_VERT;
  • SBS_SIZEBOX - wyznacza pole rozmiaru. Jeżeli nie ustawisz stylu SBS_SIZEBOX ani stylu SBS_SIZEBOXTOPLEFTALIGN wtedy okno przyjmuje wysokość, szerokość w miejscu określonym przez x, y, parametrów funkcji CreateWindow;
  • SBS_SIZEBOXBOTTOMRIGHTALIGN - określa lewy dolny narożnik kontrolki z dolnym lewym narożnikiem prostokąta określonego za pomocą parametrów funkcji CreateWindow. Należy użyć tego stylu z stylem SBS_SIZEBOX;
  • SBS_SIZEBOXTOPLEFTALIGN - wyrównuje górny lewy narożnik kontrolki z lewym górnym narożnikiem prostokąta opisanego parametrami funkcji CreateWindow. Należy użyć tego stylu z stylem SBS_SIZEBOX;
  • SBS_SIZEGRIP - to samo co SBS_SIZEBOX, lecz z podniesioną krawędzią;
  • SBS_TOPALIGN - wyrównuje górną krawędź kontrolki z górną krawędzią prostokąta zdefiniowanego w parametrach funkcji CreateWindow. Należy użyć tego stylu z stylem SBS_HORZ;
  • SBS_VERT - tworzy pionowy pasek przewijania.

Możliwe do wysłania komunikaty

Oto lista komunikatów, które można wysłać do kontrolki za pomocą funkcji SendMessage w celu uzyskania informacji o kontrolce lub ich ustawieniu:

  • SBM_ENABLE_ARROWS - aktywuje lub dezaktywuje kontrolkę przewijania;
  • SBM_GETPOS - zwraca obecną pozycję paska przewijania kontrolki. Zamiast tego komunikatu można użyć funkcji GetScrollPos;
  • SBM_GETRANGE - wysyłany, by otrzymać minimalną i maksymalną możliwą pozycję paska przewijania. Zamiast tego komunikatu można wykorzystać funkcję GetScrollRange;
  • SBM_GETSCROLLBARINFO - wysyłany przez program w celu uzyskania określonych informacji o kontrolce;
  • SBM_GETSCROLLINFO - wysyłany, by otrzymać parametry kontrolki. Zamiast tego komunikatu można użyć funkcji GetScrollInfo;
  • SBM_SETPOS - ustawia położenie paska przewijania. Można użyć zamiast tego komunikatu funkcji SetScrollPos;
  • SBM_SETRANGE - ustawia minimalną i maksymalną wartość odpowiadającą pozycji paska przewijania. Zamiast tego komunikatu można użyć funkcji SetScrollRange;
  • SBM_SETRANGEREDRAW - zmienia minimalną i maksymalną wartość odpowiadającą pozycji paska przewijania i odświeża obszar okna kontrolki;
  • SBM_SETSCROLLINFO - wysyłany, by ustawić parametry paska przewijania. Zamiast tego komunikatu można użyć funkcji SetScrollInfo.

Notyfikacje wysyłane do okna rodzica:

Oto lista notyfikacji wysyłanych przez kontrolkę bezpośrednio do okna rodzica:

  • WM_CTLCOLORSCROLLBAR - komunikat wysyłany przez okno rodzica zanim zostanie odrysowane w celu umożliwienia ustawienia koloru tła kontrolki;
  • WM_HSCROLL - wysyłany w celu obsługi określonych zdarzeń (kliknięcie, przesunięcie paska przewijania itd.) dla paska poziomego;
  • WM_VSCROLL - to samo co WM_HSCROLL ale dla paska pionowego;

Kontrolka klasy "STATIC"

Flagi stylów kontrolki

Lista flag stylów, jakie kontrolka może użyć w funkcji CreateWindow by wpłynąć na swój wygląd lub zachowanie:

  • SS_BITMAP - określa, że okno kontrolki będzie wyświetlało bitmapę. Tekst kontrolki jest nazwą bitmapy zawartej w zasobach aplikacji. Ten styl ignoruje parametry szerokości i wysokości okna i ustawia je tak, aby pasowały do bitmapy;
  • SS_BLACKFRAME - ustawia kolor ramki rysowanej dookoła okna. Kolor ten jest czarny dla domyślnego ustawienia schematów kolorów systemu;
  • SS_BLACKRECT - ustawia wypełnienie okna kolorem obecnie użytym dla jego ramki. Kolor ten jest czarny dla domyślnego ustawienia schematów kolorów systemu;
  • SS_CENTER - centruje napis w kontrolce;
  • SS_CENTERIMAGE - wypośrodkowuje bitmapę wewnątrz kontrolki, w takim przypadku rozmiar kontrolki nie jest dopasowywany do bitmapy;
  • SS_ENDELLIPSIS - przycina tekst i wstawia znak ...;
  • SS_ENHMETAFILE - określa, że plik metafile ma być wyświetlony w kontrolce. Tekstem jest nazwa pliku. Plk ten jest skalowany tak, aby pasował do rozmiaru okna;
  • SS_ETCHEDFRAME - rysuje ramkę kontrolki używając stylu EDGE_ETCHED, związanego z funkcją DrawEdge;
  • SS_ETCHEDHORZ - rysuje górną i dolną krawędź kontrolki wykorzystując stylEDGE_ETCHED, co wiąże się z funkcją DrawEdge.
  • SS_ETCHEDVERT - rysuje prawą i lewą krawędź kontrolki wykorzystując styl EDGE_ETCHED, co wiąże się z funkcją DrawEdge;
  • SS_GRAYFRAME - rysuje ramkę tym samym kolorem co tło pulpitu. Ten kolor jest szary w domyślnym ustawieniu schematu kolorów systemu;
  • SS_GRAYRECT - wypełnienie okna jest takie samo jak to z tła pulpitu. Kolor ten jest szary w domyślnym ustawieniu schematów kolorów systemu;
  • SS_ICON - ustawia ikonkę pobieraną z zasobów aplikacji na podstawie nazwy;
  • SS_LEFT - wyrównywanie tekstu do lewej krawędzi kontrolki;
  • SS_LEFTNOWORDWRAP to samo co SS_LEFT tylko, że tekst jest przycinany;
  • SS_NOPREFIX - zapobiega interpretacji każdego wystąpienia znaku & jako przedrostka akceleratora;
  • SS_NOTIFY - wysyła do okna rodzica notyfikacje: STN_CLICKED, STN_DBLCLK, STN_DISABLE oraz STN_ENABLE
  • SS_OWNERDRAW - określa, że to okno rodzic jest odpowiedzialny za odrysowanie kontrolki, która wysyła do niego komunikat WM_DRAWITEM gdy kontrolka potrzebuje odrysowania;
  • SS_PATHELLIPSIS - dodaje na końcu tekstu ... gdy ten nie mieści się w całości w obszarze okna;
  • SS_REALSIZEIMAGE - określa, że rzeczywista szerokość ikony jest wczytywana gdy użyty został styl SS_ICON;
  • SS_RIGHT - wyrównanie tekstu do prawej strony okna;
  • SS_RIGHTJUST - określa, że dolny prawy róg kontroli z stylem SS_BITMAP lub SS_ICON pozostaje stały, gdy kontrola jest zmieniana. Tylko górna i lewa strona są dopasowane do nowej bitmapy lub ikony;
  • SS_SIMPLE - określa prosty prostokąt i wyświetla pojedynczy wiersz wyrównany do lewej strony tekstu w prostokącie. Linia tekstu nie może zostać skrócona lub w jakikolwiek sposób zmieniona. Ponadto, jeśli kontrola jest wyłączona, kontrolka nie wyszaża tekstu.
  • SS_SUNKEN - rysuje granicę nawpół zatopioną wokół kontrolki;
  • SS_WHITEFRAME - rysuje obramowanie koloru obramowania okna. Ten kolor jest biały w domyślnych ustawieniach schematu kolorów;
  • SS_WHITERECT - rysuje prostokąt wypełniony kolorem obramowania okna. Ten kolor jest biały w domyślnych ustawieniach schematu kolorów systemu;

Możliwe do wysłania komunikaty

Oto lista komunikatów, które można wysłać do kontrolki za pomocą funkcji SendMessage w celu uzyskania informacji o kontrolce lub ich ustawieniu:

  • STM_GETICON - wysyłany by otrzymać uchwyt do ikony połączonej z kontrolką utworzoną z stylem SS_ICON;
  • STM_GETIMAGE - wysyłany by otrzymać uchwyt obrazka lub ikonki powiązanego z kontrolką;
  • STM_SETICON - ustawia uchwyt ikonki w kontrolce;
  • STM_SETIMAGE - ustawia uchwyt bitmapy w kontrolce;

Notyfikacje wysyłane do okna rodzica:

Oto lista notyfikacji wysyłanych przez kontrolkę w komunikacie WM_COMMAND do okna rodzica:

  • STN_CLICKED - wysyłany, gdy użytkownik kliknie kontrolkę, pod warunkiem, że styl kontrolki SS_NOTIFY jest ustawiony;
  • STN_DBLCLK - wysyłany, gdy użytkownik podwójnie kliknie kontrolkę, pod warunkiem, że styl kontrolki został ustawiony na SS_NOTIFY;
  • STN_DISABLE - wysyłany, gdy okno jest dezaktywowane, pod warunkiem, że styl kontrolki został ustawiony na SS_NOTIFY;
  • STN_ENABLE - wysyłany, gdy okno jest aktywowane, pod warunkiem, że styl kontrolki został ustawiony na SS_NOTIFY;
  • WM_CTLCOLORSTATIC - wysyłany zanim okno kontrolki zostanie odświeżone w celu umożliwienia zmiany koloru tła oraz czcionki.

Funkcje tworzące nowe okno danej klasy

Funkcja CreateWindow

Funkcja CreateWindow umożliwia tworzenie nie tylko kontrolek wyżej wymienionych nazw klas okien, ale (jak już wcześniej było to mówione i wykorzystywane w projektach) również tworzenie egzemplarzy dowolnych zarejestrowanych nazw okien. Omówię tutaj parametry tejże funkcji, w której można ustawić własne dodatkowe style okna:

Listing 1
  1. HWND CreateWindow(
  2. LPCTSTR lpClassName, // nazwa klasy okna
  3. LPCTSTR lpWindowName, // tekst zawarty w oknie (np. belce tytułowej, wewnątrz przycisku, kontrolki edycji, kontrolki statycznej
  4. DWORD dwStyle, // style własne i te podstawowe okna
  5. int x, // położenie na x-sie (można użyć CW_USEDEFAULT żeby system sam domyślnie ustawił)
  6. int y, // położenie na y-ku (można użyć CW_USEDEFAULT żeby system sam domyślnie ustawił)
  7. int nWidth, // szerokość (można użyć CW_USEDEFAULT żeby system sam domyślnie ustawił)
  8. int nHeight, // wysokość (można użyć CW_USEDEFAULT żeby system sam domyślnie ustawił)
  9. HWND hWndParent, // uchwyt okna rodzica (czasami nie ma i wtedy jest NULL)
  10. HMENU hMenu, // uchwyt menu, ale w przypadku kontrolki to raczej identyfikator okna potomnego
  11. HINSTANCE hInstance, // uchwyt instancji
  12. LPVOID lpParam // dodatkowe dane dla okna
  13. );

W przypadku kontrolek pole lpClassName powinno zawierać nazwę klasy kontrolki (mp. "EDIT"). Kolejny parametr, na który warto zwrócić uwagę to dwStyle, ten parametr przyjmuje kombinację stylów ogólnych oraz własnych, czyli takich, które są powiązane ściśle z danym typem klasy okna. Ogólne dostępne style okna to:

  • WS_BORDER - tworzy okno z obramowaniem w postaci cienkiej linii;
  • WS_CAPTION - tworzy okno, które ma pasek tytułowy i włącza w to styl WS_BORDER;
  • WS_CHILD - tworzy okno potomne. Okno z tym stylem nie może mieć paska menu i nie może być użyte z stylem WS_POPUP;
  • WS_CHILDWINDOW - to samo co WS_CHILD;
  • WS_CLIPCHILDREN - wyklucza obszar zajmowany przez okna potomnego, gdy nastąpi odrysowanie okna oknie rodzica. Styl ten jest używany podczas tworzenia okna rodzica;
  • WS_CLIPSIBLINGS - spina okna potomne względem siebie, to znaczy, gdy dane okno potomne otrzymuje komunikat WM_PAINT, wszystkie okna, które się nakładają w tym obszarze zostają odrysowane;
  • WS_DISABLED - tworzy okno, które przy inicjalizacji jest nieaktywne. Takie okno nie może otrzymywać komunikatów od użytkownika. By to zmienić po utworzeniu okna należy użyć funkcji EnableWindow;
  • WS_DLGFRAME - tworzy okno, które ma obramowanie takie, jakiem mają okna dialogowe. Okno z tym stylem nie może mieć paska tytułowego;
  • WS_GROUP - określa pierwsze okno grupy kontrolek. Grypa zawiera pierwszą kontrolkę oraz wszystkie następne aż do napotkania kontrolki z tym samym stylem.
  • WS_HSCROLL - tworzy okno, które ma poziomy pasek przewijania;
  • WS_ICONIC - tworzy okno, które przy inicjalizacji jest zminimalizowane (to samo co styl WS_MINIMIZE;
  • WS_MAXIMIZE - tworzy zmaksymalizowane okno;
  • WS_MAXIMIZEBOX - tworzy okno, które ma przycisk maksymalizacji. Ten styl nie może być użyty z stylem WS_EX_CONTEXTHELP, który jest dostępny w funkcji CreateWindowEx. Z tym stylem powinno się użyć stylu WS_SYSMENU;
  • WS_MINIMIZE - tworzy okno, które przy inicjalizacji jest zminimalizowane (to samo co styl WS_ICONIC;
  • WS_MINIMIZEBOX - tworzy okno z przyciskiem minimalizacji. Ten styl nie może być użyty z stylem WS_EX_CONTEXTHELP, który jest dostępny w funkcji CreateWindowEx. Z tym stylem powinno się użyć stylu WS_SYSMENU;
  • WS_OVERLAPPED - tworzy okno z paskiem tytułowym oraz obramowaniem. Jest to to samo co styl WS_TILED;
  • WS_OVERLAPPEDWINDOW - tworzy okno z włączonymi następującymi stylami WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX i WS_MAXIMIZEBOX. Jest to to samo co WS_TILEDWINDOW;
  • WS_POPUP - tworzy okno typu pop-up. Ten styl nie może być użyty z style WS_CHILD;
  • WS_POPUPWINDOW - tworzy okno pop-up z włączonymi stylami WS_BORDER, WS_POPUP i WS_SYSMENU. Styl WS_CAPTION i WS_POPUPWINDOW muszą być urzyte razem, aby menu oka było widoczne;
  • WS_SIZEBOX - tworzy okno, które ma obramowanie. Jest to to samo co styl WS_THICKFRAME;
  • WS_SYSMENU - tworzy okno, które ma menu na pasku tytułowym. Z tym stylem musi być użyty styl WS_CAPTION;
  • WS_TABSTOP - kontrolka może otrzymywać fokus gdy zostanie wciśnięty przycisk tabulatora. Wciśnięcie tabulatora przekazuje fokus do kolejnej kontrolki okna z ustawionym stylem WS_TABSTOP;
  • WS_THICKFRAME - to samo co WS_SIZEBOX;
  • WS_TILED - to samo co styl WS_OVERLAPPED;
  • WS_TILEDWINDOW - to samo co style WS_OVERLAPPEDWINDOW;
  • WS_VISIBLE - tworzy okno, które przy inicjalizacji jest widoczne. Styl ten można zmienić używając funkcji ShowWindow;
  • WS_VSCROLL - tworzy okno, które ma pionowy pasek przewijania;

Funkcja CreateWindowEx

Zasadniczo, funkcja ta różni się od funkcji CreateWindowEx tylko jednym parametrem, dzięki któremu można nadawać oknom dodatkowe style. Oto nagłówek tej funkcji:

Listing 2
  1. HWND CreateWindowEx(
  2. DWORD dwExStyle, // dodatkowe style okna
  3. LPCTSTR lpClassName, // nazwa klasy okna
  4. LPCTSTR lpWindowName, // tekst zawarty w oknie (np. belce tytułowej, wewnątrz przycisku, kontrolki edycji, kontrolki statycznej
  5. DWORD dwStyle, // style własne i te podstawowe okna
  6. int x, // położenie na x-sie (można użyć CW_USEDEFAULT żeby system sam domyślnie ustawił)
  7. int y, // położenie na y-ku (można użyć CW_USEDEFAULT żeby system sam domyślnie ustawił)
  8. int nWidth, // szerokość (można użyć CW_USEDEFAULT żeby system sam domyślnie ustawił)
  9. int nHeight, // wysokość (można użyć CW_USEDEFAULT żeby system sam domyślnie ustawił)
  10. HWND hWndParent, // uchwyt okna rodzica (czasami nie ma i wtedy jest NULL)
  11. HMENU hMenu, // uchwyt menu, ale w przypadku kontrolki to raczej identyfikator okna potomnego
  12. HINSTANCE hInstance, // uchwyt instancji
  13. LPVOID lpParam // dodatkowe dane dla okna
  14. );

Parametr dwExStyle funkcji CreateWindoEx umożliwia nadanie oknom następujących stylów:

  • WS_EX_ACCEPTFILES - okno utworzone z tym stylem akceptuje opuszczanie na jego powierzchnię plików;
  • WS_EX_APPWINDOW - wymusza okno najwyższego poziomu na pasku zadań, gdy okno jest widoczne;
  • WS_EX_CLIENTEDGE - określa okno z obramowaniem z wtopioną krawędzią;
  • WS_EX_COMPOSITED - Windows XP odrysowuje okna potomne wykorzystując podwójne bufforowanie;
  • WS_EX_CONTEXTHELP - dodaje znak zapytania do paska tytułowego. Gdy użytkownik wciśnie przycisk zapytania kursor zmienia się w wskaźnik z znakiem zapytania. Jeżeli użytkownik kliknie okno potomne, to okno to otrzyma komunikat WM_HELP. Ten styl nie może zostać użyty wraz z WS_MAXIMIZEBOX lub WS_MINIMIZEBOX;
  • WS_EX_CONTROLPARENT - okno zawiera okna potomne, które powinny zawierać część nawigacji okna dialogowego;
  • WS_EX_DLGMODALFRAME - tworzy okno, które ma podwójne obramowanie;
  • WS_EX_LEFT - tworzy okno, które ma ustawione wyrównanie do lewej krawędzi, jest to ustawienie domyślne;
  • WS_EX_LEFTSCROLLBAR - umieszcza pasek przewijania po lewej stronie okna;
  • WS_EX_LTRREADING - tekst w oknie jest wyświetlany wykorzystując kierunek czytania od lewej do prawej. Jest to ustawienie domylne;
  • WS_EX_MDICHILD - tworzy wielodokumentowy interfejs MDI okna potomnego;
  • WS_EX_NOPARENTNOTIFY - określa okno, które nie wysyła notyfikacji gdy okno jest tworzone lub niszczone;
  • WS_EX_OVERLAPPEDWINDOW - kombinacja stylów WS_EX_CLIENTEDGE i WS_EX_WINDOWEDGE;
  • WS_EX_PALETTEWINDOW - kombinacja stylów WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW i WS_EX_TOPMOST;
  • WS_EX_RIGHT - okno z wyrówaniem do prawej;
  • WS_EX_RIGHTSCROLLBAR - poziomy pasek przewijania ustawiony do prawej strony okna. To ustawienie jest domyślne;
  • WS_EX_RTLREADING - tekst w oknie będzie wyświetlany w kolejności od prawej do lewej;
  • WS_EX_STATICEDGE - tworzy okno z trójwymiarowym stylem obramowania;
  • WS_EX_TOOLWINDOW - tworzy okno narzędziowe;
  • WS_EX_TOPMOST - określa, że to okno powinno być wyświetlane nad wszystkimi oknami wyświetlanymi w trybie non-topmost, by zmienić ten styl należy wykorzystać funkcję SetWindowPos;
  • WS_EX_TRANSPARENT - umożliwia utworzenie przezroczystego okna. By zmienić ustawienie przezroczystości okna należy użyć funkcji SetWindowRgn;

Przykładowa implementacja programu z kontrolkami

Poniżej zamieszczam dość przydługawy kod, w którym w komentarzach postarałem się opisać sposób tworzenia i podstawowej obsługi kontrolek:

Listing 3
  1. #include <windows.h>
  2. #include <Commctrl.h>
  3. //#################################### obliczeniow.com.pl/Programowanie%20Cpp_WinApi%20Podstawowe_klasy_okien_systemu_Windows ##################################
  4. // ################################### IDENTYFIKATORY KONTROLEK #####################################
  5. #define ID_BUTTON_OK 100
  6. #define ID_BUTTON_CHECKBOX 101
  7. #define ID_BUTTON_RADIOBUTTON 102
  8. #define ID_BUTTON_COMMANDLINK 103
  9. #define ID_BUTTON_GROUPBOX 104
  10. #define ID_BUTTON_RADIOBUTTON2 105
  11. #define ID_COMBOBOX 106
  12. #define ID_COMBOBOX2 107
  13. #define ID_LISTBOX 108
  14. #define ID_STATIC 108
  15. // ################################### UCHWYTY KONTROLEK ############################################
  16. HWND hWnd;
  17. HWND hButtonGroupbox;
  18. HWND hButtonOK;
  19. HWND hButtonCheckbox;
  20. HWND hButtonRadiobutton;
  21. HWND hButtonRadiobutton2;
  22. HWND hComboBox;
  23. HWND hComboBox2;
  24. HWND hListBox;
  25. HWND hStatic;
  26. LRESULT CALLBACK hwndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
  27. static RECT wndSize; // zmienna statyczna przechowująca informacje o wymiarach okna
  28. switch(msg){
  29. case WM_CREATE: // ten komunikat będzie obsłużony zawsze jako pierwszy
  30. {
  31. }
  32. break;
  33. case WM_DESTROY: // ten komunikat będzie obsłużony, gdy wciśniesz przycisk zamknięcia programu
  34. {
  35. PostQuitMessage(0); // kończy program
  36. }
  37. break;
  38. //############################################## OBSŁUGA KONTROLKI PASKA PRZEWIJANIA POZIOMEGO ##############################################
  39. case WM_HSCROLL:
  40. {
  41. if(lParam == NULL){ // gdy lParam jest równe NULL to komunikat przychodzi od kontrolki pionowego paska przewijania automatycznie dodanego do okna za pomocą stylu WS_HSCROLL
  42. SCROLLINFO si; // struktura opisująca stan paska przewijania
  43. ZeroMemory(&si, sizeof(si)); // zerowanie pól struktury
  44. si.cbSize = sizeof(si); // rozmiar struktury w bajtach
  45. si.fMask = SIF_ALL; // maska infromująca, że pobierane będą wszystkie parametry kontrolki
  46. GetScrollInfo(hWnd, SB_HORZ, &si); // pobieranie informacji o kontrolce
  47. switch(LOWORD(wParam)){
  48. case SB_LINELEFT: // przewijanie w lewo
  49. {
  50. si.nPos -= 1;
  51. }
  52. break;
  53. case SB_LINERIGHT: // przewijanie w prawo
  54. {
  55. si.nPos += 1;
  56. }
  57. break;
  58. case SB_PAGELEFT: // przewijanie w lewo o zadaną wartość
  59. {
  60. si.nPos -= 10;
  61. }
  62. break;
  63. case SB_PAGERIGHT: // przewijanie w lewo o zadaną wartość
  64. {
  65. si.nPos += 10;
  66. }
  67. break;
  68. case SB_THUMBPOSITION: // przewijanie paska poprzez przesuwanie i opuszczenie lewego przycisku myszy
  69. {
  70. si.nPos = si.nTrackPos;
  71. }
  72. break;
  73. //case SB_THUMBTRACK:
  74. // {
  75. // si.nPos = si.nTrackPos;
  76. // }
  77. // break;
  78. }
  79. si.fMask = SIF_POS; // tym razem ustawione zostanie tylko położenie
  80. SetScrollInfo(hWnd, SB_HORZ, &si, true); // wprowadzanie zmian wraz z odświerzaniem kontrolki
  81. }
  82. }
  83. break;
  84. //############################# OBSŁUGA PASKA PRZEWIJANIA PIONOWEGO ####################################
  85. case WM_VSCROLL:
  86. {
  87. if(lParam == NULL){
  88. SCROLLINFO si;
  89. ZeroMemory(&si, sizeof(si));
  90. si.cbSize = sizeof(si);
  91. si.fMask = SIF_ALL;
  92. GetScrollInfo(hWnd, SB_VERT, &si);
  93. switch(LOWORD(wParam)){
  94. case SB_LINELEFT:
  95. {
  96. si.nPos -= 1;
  97. }
  98. break;
  99. case SB_LINERIGHT:
  100. {
  101. si.nPos += 1;
  102. }
  103. break;
  104. case SB_PAGELEFT:
  105. {
  106. si.nPos -= 10;
  107. }
  108. break;
  109. case SB_PAGERIGHT:
  110. {
  111. si.nPos += 10;
  112. }
  113. break;
  114. case SB_THUMBPOSITION:
  115. {
  116. si.nPos = si.nTrackPos;
  117. }
  118. break;
  119. //case SB_THUMBTRACK:
  120. // {
  121. // si.nPos = si.nTrackPos;
  122. // }
  123. // break;
  124. }
  125. si.fMask = SIF_POS;
  126. SetScrollInfo(hWnd, SB_VERT, &si, true);
  127. }
  128. }
  129. break;
  130. case WM_COMMAND:
  131. {
  132. // ############################# OBSŁUGA KOMUNIKATÓW KONSTROLEK #################################
  133. if(lParam){
  134. switch(LOWORD(wParam)){
  135. case ID_BUTTON_OK: // przycisk ok
  136. {
  137. switch(HIWORD(wParam)){
  138. case BN_CLICKED: // kliknięty
  139. {
  140. MessageBox(hWnd, L"O! Kliknąłeś przycisk OK!",L"Informacja",MB_OK);
  141. }
  142. break;
  143. }
  144. }
  145. break;
  146. case ID_BUTTON_CHECKBOX: // przycisk checkbox
  147. {
  148. switch(HIWORD(wParam)){
  149. case BN_CLICKED: // kliknięty
  150. {
  151. UINT c = SendMessage(HWND(lParam), BM_GETCHECK, 0, 0);
  152. SendMessage(HWND(lParam), BM_SETCHECK, (SendMessage(HWND(lParam), BM_GETCHECK, 0, 0) == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED, 0);
  153. }
  154. break;
  155. }
  156. }
  157. break;
  158. case ID_BUTTON_RADIOBUTTON: // pierwszy przycisk radiobutton
  159. {
  160. switch(HIWORD(wParam)){
  161. case BN_CLICKED: // kliknięty
  162. {
  163. SendMessage(HWND(lParam), BM_SETCHECK, BST_CHECKED, 0);
  164. SendMessage(hButtonRadiobutton2, BM_SETCHECK, BST_UNCHECKED, 0);
  165. }
  166. break;
  167. }
  168. }
  169. break;
  170. case ID_BUTTON_RADIOBUTTON2: // drugi przycisk radiobutton
  171. {
  172. switch(HIWORD(wParam)){
  173. case BN_CLICKED: // kliknięty
  174. {
  175. SendMessage(HWND(lParam), BM_SETCHECK, BST_CHECKED, 0);
  176. SendMessage(hButtonRadiobutton, BM_SETCHECK, BST_UNCHECKED, 0);
  177. }
  178. break;
  179. }
  180. }
  181. break;
  182. case ID_COMBOBOX: // COMBOBOX
  183. {
  184. switch(HIWORD(wParam)){
  185. case CBN_SELCHANGE: // zmieniono zaznaczenie
  186. {
  187. MessageBox(hWnd, L"Zmieniono zaznaczenie", L"Informacja",MB_OK);
  188. }
  189. break;
  190. }
  191. }
  192. break;
  193. case ID_COMBOBOX2: // COMBOBOX2
  194. {
  195. switch(HIWORD(wParam)){
  196. case CBN_SELCHANGE: // zmieniono zaznaczenie
  197. {
  198. MessageBox(hWnd, L"Zmieniono zaznaczenie", L"Informacja",MB_OK);
  199. }
  200. break;
  201. }
  202. }
  203. break;
  204. case ID_LISTBOX: // LISTBOX
  205. {
  206. switch(HIWORD(wParam)){
  207. case LBN_SELCHANGE: // zmieniono zaznaczenie
  208. {
  209. MessageBox(hWnd, L"Zmieniono zaznaczenie", L"Informacja",MB_OK);
  210. }
  211. break;
  212. }
  213. }
  214. break;
  215. }
  216. }
  217. }
  218. break;
  219. case WM_SIZE:
  220. {
  221. SetRect(&wndSize,0,0,LOWORD(lParam),HIWORD(lParam)); // ustawia strukturę wndSize tak, aby przechowywała szerokość i wysokość okna
  222. }
  223. break;
  224. }
  225. return DefWindowProc(hWnd, msg, wParam, lParam);
  226. }
  227. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE , LPSTR str, int ){
  228. WNDCLASS wnd;
  229. wchar_t wndClassName[] = L"KontrolkiWindows";
  230. wnd.cbClsExtra = NULL; // ten parametr powinien być ustawiony na null (powinien on zawierać informacje o rozmiarze dodatkowych danych jakie będą przechowywane dla danej klasy okna)
  231. wnd.cbWndExtra = NULL; // ten parametr powinien być ustawiony na null (powinien on zawierać informacje o rozmiarze dodatkowych danych jakie będą przechowywane dla danego egzemplarza okna)
  232. wnd.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); // to będzie tło okna
  233. wnd.hCursor = LoadCursor(NULL, IDC_ARROW); // ładowanie standardowego kursora
  234. wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION); // ładowanie standardowej ikonki aplikacji
  235. wnd.hInstance = hInst; // uchwyt instancji programu
  236. wnd.lpfnWndProc = hwndProc; // wskaźnik do funkcji będącej procedurą okna
  237. wnd.lpszClassName = wndClassName; // nazwa klasy okna
  238. wnd.lpszMenuName = NULL; // tutaj powinno być menu, ale tym razem nie będzie żadnego menu więc NULL
  239. wnd.style = CS_VREDRAW|CS_HREDRAW; // opcje wyświetlania okna CS_VREDRAW i CS_HREDRAW oznaczają odświerzanie okna w poziomie i pionie
  240. if(!RegisterClass(&wnd)){ // jeżeli nie udało się zarejestrować klassy okna
  241. MessageBox(NULL,L"Wzięło się i nie zarejestrowało", L"Błąd", MB_OK); // to płacz, że coś się stało
  242. return 0; // i zwracaj zero
  243. }
  244. //######################################## TWORZENIE OKNA GŁÓWNEGO ######################################
  245. hWnd = CreateWindow(wndClassName, // nazwa klasy okna
  246. wndClassName, // tekst belki tytułowej okna
  247. WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL, // styl okna (ten oznacza z belką tytułową, przyciskami minimalizacji, maksymalizacji i zwijania oraz z ramką, oraz style poziomego i pionowego paska przewijania
  248. CW_USEDEFAULT, // pozycja x (CS_USEDEFAULT oznacza domyślne)
  249. CW_USEDEFAULT, // pozycja y (CS_USEDEFAULT oznacza domyślne)
  250. CW_USEDEFAULT, // szerokość (CS_USEDEFAULT oznacza domyślne)
  251. CW_USEDEFAULT, // wysokość (CS_USEDEFAULT oznacza domyślne)
  252. NULL, // okno rodzica (tutaj nie będzie takiego więc NULL)
  253. NULL, // wskaźnik do menu (też nie będzie więc NULL)
  254. hInst, // uchwyt instancji programu
  255. NULL // wskaźnik do dodatkowych danych
  256. );
  257. //######################################### OKNA KONTROLEK ###############################################
  258. //######################################### PRZYCISKI #####################################################
  259. hButtonGroupbox = CreateWindow(L"BUTTON", // nazwa klasy kontrolki
  260. L"GroupBox", // tekst wyświetlany w kontrolce
  261. WS_VISIBLE|WS_CHILD|BS_GROUPBOX , // flagi podstawowe: widoczność; okno potomne; wciskany przycisk
  262. 10, 0, 140, 160, // położenie i wymiary
  263. hWnd, // okno rodzic
  264. (HMENU)ID_BUTTON_GROUPBOX, // identyfikator okna
  265. hInst, // uchwyt instancji programu
  266. NULL // to pole powinno być ustawione na NULL
  267. );
  268. hButtonOK = CreateWindow(L"BUTTON", // nazwa klasy kontrolki
  269. L"OK", // tekst wyświetlany w kontrolce
  270. WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, // flagi podstawowe: widoczność; okno potomne; wciskany przycisk
  271. 20, 20, 120, 30, // położenie i wymiary
  272. hWnd, // okno rodzic
  273. (HMENU)ID_BUTTON_OK, // identyfikator okna
  274. hInst, // uchwyt instancji programu
  275. NULL // to pole powinno być ustawione na NULL
  276. );
  277. hButtonCheckbox = CreateWindow(L"BUTTON", L"Checkbox",
  278. WS_VISIBLE|WS_CHILD|BS_CHECKBOX, // ostatni styl wyświetla pole wielokrotnego wyboru checbox
  279. 20, 50, 120, 30, hWnd,
  280. (HMENU)ID_BUTTON_CHECKBOX, // identyfikator okna
  281. hInst, NULL);
  282. hButtonRadiobutton = CreateWindow(L"BUTTON", L"Radiobutton",
  283. WS_VISIBLE|WS_CHILD|BS_RADIOBUTTON|WS_GROUP, // przycisk radio dla jednokrotnego wyboru
  284. 20, 90, 120, 30, hWnd,
  285. (HMENU)ID_BUTTON_RADIOBUTTON, // identyfikator przycisku
  286. hInst, NULL);
  287. hButtonRadiobutton2 = CreateWindow(L"BUTTON", L"Radiobutton2",
  288. WS_VISIBLE|WS_CHILD|BS_RADIOBUTTON|WS_GROUP, // przycisk radio dla jednokrotnego wyboru
  289. 20, 120, 120, 30, hWnd,
  290. (HMENU)ID_BUTTON_RADIOBUTTON2, // identyfikator przycisku
  291. hInst, NULL);
  292. //################################################ COMBO BOX-y ##############################################################
  293. hComboBox = CreateWindow(L"COMBOBOX", L"",
  294. WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_AUTOHSCROLL|CBS_DROPDOWNLIST |CBS_DISABLENOSCROLL|CBS_SORT|CBS_NOINTEGRALHEIGHT ,
  295. 160,10,120,100, hWnd,
  296. (HMENU)ID_COMBOBOX,
  297. hInst, NULL);
  298. SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM) L"Polska");
  299. SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM) L"Francja");
  300. SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM) L"Dania");
  301. SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM) L"Słowacja");
  302. SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM) L"Czechy");
  303. SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM) L"Niemcy");
  304. SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM) L"Bułgaria");
  305. SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM) L"Szwecja");
  306. SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM) L"Włochy");
  307. hComboBox2 = CreateWindow(L"COMBOBOX", L"",
  308. WS_VISIBLE|WS_CHILD|CBS_AUTOHSCROLL|WS_VSCROLL|CBS_DISABLENOSCROLL|CBS_SORT,
  309. 300,10,120,100, hWnd,
  310. (HMENU)ID_COMBOBOX2,
  311. hInst, NULL);
  312. SendMessage(hComboBox2, CB_ADDSTRING, 0, (LPARAM) L"Polska");
  313. SendMessage(hComboBox2, CB_ADDSTRING, 0, (LPARAM) L"Francja");
  314. SendMessage(hComboBox2, CB_ADDSTRING, 0, (LPARAM) L"Dania");
  315. SendMessage(hComboBox2, CB_ADDSTRING, 0, (LPARAM) L"Słowacja");
  316. SendMessage(hComboBox2, CB_ADDSTRING, 0, (LPARAM) L"Czechy");
  317. SendMessage(hComboBox2, CB_ADDSTRING, 0, (LPARAM) L"Niemcy");
  318. SendMessage(hComboBox2, CB_ADDSTRING, 0, (LPARAM) L"Bułgaria");
  319. SendMessage(hComboBox2, CB_ADDSTRING, 0, (LPARAM) L"Szwecja");
  320. SendMessage(hComboBox2, CB_ADDSTRING, 0, (LPARAM) L"Włochy");
  321. //######################################## LISTBOX #########################################
  322. hListBox = CreateWindow(L"LISTBOX", L"",
  323. WS_VISIBLE|WS_CHILD|WS_VSCROLL|LBS_SORT|LBS_HASSTRINGS|LBS_NOTIFY,
  324. 430,10,120,100, hWnd,
  325. (HMENU)ID_LISTBOX,
  326. hInst, NULL);
  327. SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM) L"Polska");
  328. SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM) L"Francja");
  329. SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM) L"Dania");
  330. SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM) L"Słowacja");
  331. SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM) L"Czechy");
  332. SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM) L"Niemcy");
  333. SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM) L"Bułgaria");
  334. SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM) L"Szwecja");
  335. SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM) L"Włochy");
  336. SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM) L"Portugalia");
  337. SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM) L"Hiszpania");
  338. hListBox = CreateWindow(L"STATIC", L"Kontrolka Static",
  339. WS_VISIBLE|WS_CHILD,
  340. 560,10,120,30, hWnd,
  341. (HMENU)ID_STATIC,
  342. hInst, NULL);
  343. //######################################## KONIEC TWORZENIA KONTROLEK ###########################################
  344. ShowWindow(hWnd, SW_NORMAL); // wyświetlania okna i jego tryb
  345. UpdateWindow(hWnd); // wymuszenie pierwszego odświerzenia okna
  346. MSG msg; // struktura komunikatów
  347. while(GetMessage(&msg, 0,0,0)){ // dopóki nie otrzymano komunikatu == 0
  348. TranslateMessage(&msg); // tłumacz komunikat
  349. DispatchMessage(&msg); // rozpakuj komunikat
  350. }
  351. return 0;
  352. }

Komentarze