Nie wiem czy Bóg istnieje, ale byłoby z korzyścią dla Jego reputacji, gdyby nie istniał" - Renard

Okno dialogowe jest szerokie na 40 znaków i wysokie na 10. Taki system pozwala używać współrzędnych i rozmiarów, które umożliwiają zachowanie ogólnego wyglądu i wymiaru niezależnie od rozdzielczości ekranu i wybranej czcionki. Ponieważ znaki mają zwykle wysokość około dwóch razy większą od szerokości wymiaru, na osiach x i y są prawie takie same. Instrukcja STYLE w szablonie jest podobna do pola Style lub wywołania Create- Window. WS_POPUP i DS MODALFRAME są zwykle używane do modalnych okien dialogowych, ale nie tylko, o czym napiszemy później. Pomiędzy instrukcjami BEGlN i END (lub nawiasami, jeśli preferujesz je, sam pro- jektując okno dialogowe) definiuje się kontrolki okna potomnego, które pojawią się w oknie dialogowym. Nasze okno używa trzech typów kontrolek okna po- tomnego: DEFPUSHBUTTON (domyślny przycisk polecenia), ICON (ikona) i CTEXT (tekst wyśrodkowany). Format tych instrukcji jest następujący: control-type "text" id, xPos, yPos, xWidth, yHeight, iStyle Wartość iStyle na końcu instrukcji jest opcjonalna. Określa dodatkowe style okna, które używają identyfţkatorów zdefiniowanych w plikach nagłówkowych Windows. Identyfikatory DEFPUSHBUTTON, ICON i CTEXT używane są tylko w oknach dialogowych. Skracają one dostęp do poszczególnych klas i stylów okna. CTEXT wskazuje na przykład, że klasa okna potomnego jest statyczna, a styl równy: WS CHILD ţ SS CENTER ţ WS VISIBLE ţ WSţGROUP Identyfikatora WS GROUP użyliśmy po raz pierwszy, ale style okna WS CHILD, SS_CENTER i WS VISIBLE stosowaliśmy już podczas tworzenia kontrolek okna potomnego w programie COLORSI w rozdziale 9. 448 Część i: Podstawy I Dla ikony pole "text" jest nazwą zasobu ikony programu, która także została zdefiniowana w skrypcie zasobów ABOUTI. Pole "text" przycisku polecenia za- wiera tekst, który pojawi się na przycisku. Tekst ten odpowiada drugiemu argu- mentowi podawanemu w wywołaniu CreateWindow, gdy tworzysz kontrolkę okna potomnego w programie. Pole id jest wartością, której okno potomne używa do identyfikacji, gdy wysyła komunikaty (zwykle WM-COMMAND) do okna nadrzędnego. Oknem nadrzęd- nym kontrolki okna potomnego jest okno dialogowe, które przesyła komunikaty dalej do procedury okna w Windows. Procedura okna wysyła te komunikaty także do procedury okna dialogowego, którą dołączasz do programu. Wartości id od- powiadają identyfikatorom okien potomnych używanych w funkcji CreateWindow (zobacz rozdział 9). Ponieważ kontrollti ikony i tekstu nie wysyłają komunika- tów do okna nadrzędnego, ich wartości id są ustawione na IDC_STATIC, która jest zdefiniowana w RESOURCE.H jako -1. Wartością identyfikatora przycisku polecenia jest IDOK, zdefiniowana w WINUSER.H jako 1. Kolejne cztery liczby ustalają położenie kontrolki okna potomnego (względem górnego lewego rogu obszaru roboczego okna dialogowego) oraz jej rozmiar. Po- łożenie i rozmiar wyrażone są w jednostkach równych jednej czwartej średniej szerokości czcionki i jednej ósmej jej wysokości. Wartości xWidth i yHeight są igno- rowane w przypadku instrukcji ICON. Instrukcja DEFPUSHBUTTON w szablonie okna dialogowego dołącza dodatko- wo styl WS GROUP oprócz stylu wymuszanego przez słowo kluczowe DEFPU- SHBUTTON. Podam więcej informacji o WS GROUP (i związanym z nim stylu WS TABSTOP), gdy będę omawiał drugą wersję tego programu - ABOUT2. Procedura okna dialogowego Procedura okna dialogowego w programie obsługuje komunikaty okna dialogo- wego. Mimo że jest ona podobna do zwykłej procedury okna, w rzeczywistości nie jest taką procedurą. Procedura okna dla okna dialogowego znajduje się we- wnątrz systemu Windows. Wywołuje ona procedurę okna dialogowego z komu- nikatami, które otrzyrna. Poniżej pokazana jest procedura okna dialogowego z pro- gramu ABOUTl: BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) r switch (message) ( case WMţINITDIALO6 return TRUE case WM COMMAND : switch (LOWORD (wParam)) ( case IDOK : case IDCANCEL : EndDialog (hDlg, 0) ; return TRUE : Rozdział 11: Okna dialogowe break ; ) return FALSE ; 449 Parametry tej funkcji są takie same jak w przypadku zwykłej procedury okna. Tak ak ona, procedura okna dialogowego musi być zdefiniowana jako funkcja CALLBACK. Mimo że zastosowałem hDlg jako uchwyt okna dialogowego, mo- żesz zamiast niego użyć równie dobrze hwnd. Przyjrzyjmy się różnicom pomię- dzy tą funkcją a procedurą okna: ů Procedura okna zwraca typ LRESULT, a procedura okna dialogowego - typ BOOL, który zdefiniowany jest w plikach nagłówkowych Windows jako int. ů Procedura okna wywołuje funkcję Def 4VindowProc, jeśli nie przetwarza okre- ślonych komunikatów, a procedura okna dialogowego zwraca wartość TRUE (niezerową), jeśli przetwarza komunikat, i FALSE (0), jeśli tego nie robi. ů Procedura okna dialogowego nie potrzebuje przetwarzać komunikatów WM PAINT ani WM DESTROY i nie odbiera komunikatu WM CREATE. Zamiast tego wykonuje inicjację podczas specjalnego komunikatu WM INIT DIALOG. Komunikat WM INITDIALOG to pierwszy komunikat, który odbiera procedura okna dialogowego. Jest on wysyłany tylko do procedur okien dialogowych. Jeśli rocedura okna dialogowego zwróci wartość'TRUE, Windows ustawia fokus wej- ś iowy na pierwszą w oknie dialogowym kontrolkę okna potomnego, która ma styl WS TABSTOP (styl ten omówię przy okazji programu ABOUT2). W tym oknie dialogowym pierwszą kontrolką, która ma taki styl, jest przycisk polecenia. Al- ternatywnie podczas przetwarzania komunikatu WM INITDIALOG procedura okna dialogowego może użyć funkcji SetFocus, aby ustawić fokus w oknie dialo- gowym na jednej z kontrolek okna potomnego, i zwrócić wartość FALSE. Nasze okno dialogowe przetwarza jeszcze tylko jeden komunikat - WM COM- MAND. Jest to komunikat, który przycisk polecenia wysyła do swojego okna nadrzędnego, gdy zostanie kliknięty przyciskiem myszy lub naciśnięty będzie kla- wisz [Spacja}, a przycisk ma fokus wejściowy. Identyfikator kontrolki (który usta- wiliśmy na IDOK w szablonie okna dialogowego) jest mniej znaczącym słowem lParam. Dla tego komunikatu procedura okna dialogowego wywołuje funkcję End- Dialo , które nakazuje Windows, aby zruszczył okno dialogowe. Dla pozostałych komunikatów nasza procedura okna dialogowego zwraca wartość FALSE, która mówi procedurze okna dialogowego wewnątrz Windows, że nasza procedura nie rzetworzyła komunikatu