Informacje o oknach dialogowych
Istnieje wiele funkcji, komunikatów i wstępnie zdefiniowanych kontrolek, które ułatwiają tworzenie okien dialogowych i zarządzanie nimi, co ułatwia tworzenie interfejsu użytkownika dla aplikacji. W tym omówieniu opisano funkcje i komunikaty okna dialogowego oraz wyjaśniono, jak ich używać do tworzenia i używania okien dialogowych.
Omówienie zawiera następujące tematy:
- kiedy należy użyć okna dialogowego
- Okno właściciela okna dialogowego
- Okna komunikatów
- Modalne Okna Dialogowe
- Okna dialogowe bez trybu modalnego
- szablony okien dialogowych
- style szablonu okna dialogowego
- Pomiary okna dialogowego
- kontrolki okna dialogowego
- Menu okna dialogowego
- Czcionki Okna Dialogowego
- Szablony w pamięci
Aby uzyskać więcej informacji na temat typowych okien dialogowych, zobacz Common Dialog Box Library.
Kiedy używać okna dialogowego
Większość aplikacji używa okien dialogowych, aby wyświetlić dodatkowe informacje o elementach menu wymagających danych wejściowych użytkownika. Używanie okna dialogowego jest jedynym zalecanym sposobem pobierania danych wejściowych przez aplikację. Na przykład typowy element menu Otwórz wymaga nazwy pliku do otwarcia, dlatego aplikacja powinna użyć okna dialogowego, aby wyświetlić monit o podanie nazwy. W takich przypadkach aplikacja tworzy okno dialogowe, gdy użytkownik kliknie element menu i zniszczy okno dialogowe natychmiast po podaniu informacji przez użytkownika.
Wiele aplikacji używa również okien dialogowych do wyświetlania informacji lub opcji podczas pracy użytkownika w innym oknie. Na przykład aplikacje do przetwarzania wyrazów często używają okna dialogowego z opcją wyszukiwania tekstu. Gdy aplikacja wyszukuje tekst, okno dialogowe pozostaje na ekranie. Użytkownik może następnie wrócić do okna dialogowego i wyszukać to samo słowo ponownie; lub użytkownik może zmienić wpis w oknie dialogowym i wyszukać nowe słowo. Aplikacje korzystające z okien dialogowych w ten sposób zwykle tworzą je, gdy użytkownik kliknie element menu i będzie nadal wyświetlać go tak długo, jak aplikacja działa lub dopóki użytkownik jawnie zamknie okno dialogowe.
Aby obsługiwać różne sposoby używania okien dialogowych przez aplikacje, wyróżnia się dwa typy okien dialogowych: modalne i niemodalne. modalne okno dialogowe wymaga od użytkownika podania informacji lub anulowania okna dialogowego przed zezwoleniem aplikacji na kontynuowanie. Aplikacje używają modalnych okien dialogowych w połączeniu z elementami menu, które wymagają dodatkowych informacji, zanim będą mogły kontynuować. Okno dialogowe niemodalne umożliwia użytkownikowi podanie informacji i powrót do poprzedniego zadania bez jego zamykania. Modalne okna dialogowe są prostsze do zarządzania niż niemodalne okna dialogowe, ponieważ są tworzone, wykonują swoje zadanie i są niszczone przez wywołanie pojedynczej funkcji.
Aby utworzyć modalne lub niemodalne okno dialogowe, aplikacja musi dostarczyć szablon okna dialogowego do opisania jego stylu i zawartości; aplikacja musi również dostarczyć procedurę okna dialogowego do wykonywania zadań. Szablon okna dialogowego jest binarnym opisem okna dialogowego i kontrolkami, które zawiera. Deweloper może utworzyć ten szablon jako zasób do załadowania z pliku wykonywalnego aplikacji lub utworzyć go w pamięci podczas uruchamiania aplikacji. Procedura okna dialogowego to zdefiniowana przez aplikację funkcja wywołania zwrotnego, którą system wywołuje, gdy ma dane wejściowe dla okna dialogowego lub zadania do wykonania w oknie dialogowym. Chociaż procedura okna dialogowego jest podobna do procedury okna, nie pełni tych samych funkcji.
Aplikacja zazwyczaj tworzy okno dialogowe, używając albo funkcji DialogBox, albo CreateDialog. Okno dialogowe tworzy okno dialogowe modalne; CreateDialog tworzy okno dialogowe niemodalne. Te dwie funkcje ładują szablon okna dialogowego z pliku wykonywalnego aplikacji i tworzą okno podręczne zgodne ze specyfikacjami szablonu. Istnieją inne funkcje, które tworzą okno dialogowe przy użyciu szablonów w pamięci; przekazują dodatkowe informacje do procedury okna dialogowego podczas tworzenia okna dialogowego.
Okna dialogowe zazwyczaj należą do wstępnie zdefiniowanej, wyłącznej klasy okien. System używa tej klasy okien i odpowiadającej jej procedury okna zarówno dla modalnych, jak i niemodalnych okien dialogowych. Po wywołaniu funkcji tworzy okno dialogowe oraz okna dla kontrolek w oknie dialogowym, a następnie wysyła wybrane komunikaty do procedury okna dialogowego. Gdy okno dialogowe jest widoczne, wstępnie zdefiniowana procedura okna zarządza wszystkimi komunikatami, przetwarza niektóre komunikaty i przekazuje inne do procedury okna dialogowego, aby procedura mogła wykonywać zadania. Aplikacje nie mają bezpośredniego dostępu do wstępnie zdefiniowanej klasy okna lub procedury okna, ale mogą używać szablonu okna dialogowego i procedury okna dialogowego, aby zmodyfikować styl i zachowanie okna dialogowego.
Okno właściciela okna dialogowego
Większość okien dialogowych ma okno właściciela (lub po prostu właściciela). Podczas tworzenia okna dialogowego aplikacja ustawia właściciela, określając uchwyt okna właściciela. System używa właściciela do określenia położenia okna dialogowego w hierarchii Z, aby okno dialogowe było zawsze umieszczone nad jego właścicielem. Ponadto system może wysyłać komunikaty do procedury okna właściciela, powiadamiając go o zdarzeniach w oknie dialogowym.
System automatycznie ukrywa lub niszczy okno dialogowe za każdym razem, gdy jego właściciel jest ukryty lub zniszczony. Oznacza to, że procedura okna dialogowego nie wymaga specjalnego przetwarzania w celu wykrycia zmian stanu okna właściciela.
Ponieważ typowe okno dialogowe jest używane w połączeniu z elementem menu, okno właściciela jest zwykle oknem zawierającym menu. Chociaż istnieje możliwość utworzenia okna dialogowego, które nie ma właściciela, nie jest zalecane. Na przykład gdy modalne okno dialogowe nie ma właściciela, system nie wyłącza żadnego z innych okien aplikacji i umożliwia użytkownikowi kontynuowanie pracy w innych oknach, pokonując cel modalnego okna dialogowego.
Gdy okno dialogowe bez moderowania nie ma właściciela, system ani nie ukrywa ani nie niszczy okna dialogowego, gdy inne okna w aplikacji są ukryte lub zniszczone. Mimo że nie niweczy to celu niemodalnego okna dialogowego, wymaga, aby aplikacja przeprowadziła specjalne przetwarzanie, aby upewnić się, że okno dialogowe jest ukrywane i niszczone we właściwym czasie.
Pola komunikatów
Okno komunikatu to specjalne okno dialogowe, którego aplikacja może używać do wyświetlania komunikatów i monitowania o proste dane wejściowe. Pole komunikatu zazwyczaj zawiera wiadomość SMS i co najmniej jeden przycisk. Aplikacja tworzy pole komunikatu przy użyciu funkcji MessageBox lub MessageBoxEx, określając tekst oraz liczbę i typy przycisków do wyświetlenia. Proszę zauważyć, że obecnie nie ma różnicy między działaniem MessageBox i MessageBoxEx.
Chociaż okno komunikatu jest rodzajem okna dialogowego, system przejmuje pełną kontrolę nad jego tworzeniem i zarządzaniem. Oznacza to, że aplikacja nie udostępnia szablonu okna dialogowego i procedury okna dialogowego. System tworzy własny szablon na podstawie tekstu i przycisków określonych dla okna komunikatu i dostarcza własną procedurę okna dialogowego.
Okno komunikatu to modalne okno dialogowe, a system tworzy go przy użyciu tych samych funkcji wewnętrznych, które Okno dialogowe używa. Jeśli aplikacja określa okno właściciela podczas wywoływania MessageBox lub MessageBoxEx, system wyłączy właściciela. Aplikacja może również kierować system, aby wyłączyć wszystkie okna najwyższego poziomu należące do bieżącego wątku, określając wartość MB_TASKMODAL podczas tworzenia okna dialogowego.
System może wysyłać komunikaty do właściciela, takie jak WM_CANCELMODE i WM_ENABLE, tak samo jak podczas tworzenia modalnego okna dialogowego. Okno właściciela powinno wykonywać wszelkie akcje żądane przez te komunikaty.
Modalne okna dialogowe
Modalne okno dialogowe powinno być wyskakującym oknem z menu okna, paskiem tytułowym i grubym obramowaniem. Oznacza to, że szablon okna dialogowego powinien określać style: WS_POPUP, WS_SYSMENU, WS_CAPTIONoraz DS_MODALFRAME. Mimo że aplikacja może wyznaczyć styl WS_VISIBLE, system zawsze wyświetla modalne okno dialogowe niezależnie od tego, czy szablon okna dialogowego określa styl WS_VISIBLE. Aplikacja nie może utworzyć modalnego okna dialogowego o stylu WS_CHILD. Modalne okno dialogowe z tym stylem zostaje zablokowane, uniemożliwiając kolejne dane wejściowe dotarcie do aplikacji.
Aplikacja tworzy modalne okno dialogowe, używając funkcji DialogBox lub funkcji DialogBoxIndirect. Okno dialogowe wymaga nazwy lub identyfikatora zasobu zawierającego szablon okna dialogowego; DialogBoxIndirect wymaga dojścia do obiektu pamięci zawierającego szablon okna dialogowego. Funkcje DialogBoxParam i DialogBoxIndirectParam również tworzą modalne okna dialogowe; są identyczne z wcześniej wymienionymi funkcjami, ale przekazują określony parametr do procedury okna dialogowego po utworzeniu okna dialogowego.
Podczas tworzenia modalnego okna dialogowego system sprawia, że jest to aktywne okno. Okno dialogowe pozostaje aktywne, dopóki procedura okna dialogowego nie wywołuje funkcji EndDialog lub system aktywuje okno w innej aplikacji. Ani użytkownik, ani aplikacja nie mogą uaktywnić okna właściciela do momentu zniszczenia modalnego okna dialogowego.
Gdy okno właściciela nie jest jeszcze wyłączone, system automatycznie wyłącza okno i wszystkie okna podrzędne należące do niego podczas tworzenia modalnego okna dialogowego. Okno właściciela pozostaje wyłączone do momentu zniszczenia okna dialogowego. Chociaż procedura okna dialogowego może potencjalnie włączyć okno właściciela w dowolnym momencie, włączenie właściciela zaprzecza celowi okna dialogowego w trybie modalnym i nie jest zalecane. Gdy procedura okna dialogowego zostanie zniszczona, system ponownie włączy okno właściciela, ale tylko wtedy, gdy modalne okno dialogowe spowodowało wyłączenie właściciela.
Gdy system tworzy modalne okno dialogowe, wysyła komunikat WM_CANCELMODE do okna (jeśli istnieje), które aktualnie przechwytuje dane z myszy. Aplikacja, która odbiera ten komunikat, powinna zwolnić przechwytywanie myszy, aby użytkownik mógł przesuwać myszą w modalnym oknie dialogowym. Ponieważ system wyłącza okno właściciela, wszystkie dane wejściowe myszy zostaną utracone, jeśli właściciel nie zwolni myszy po otrzymaniu tego komunikatu.
Aby przetwarzać komunikaty dla modalnego okna dialogowego, system uruchamia własną pętlę komunikatów, przejmuje tymczasową kontrolę nad kolejką komunikatów dla całej aplikacji. Gdy system pobiera komunikat, który nie jest jawnie przeznaczony dla okna dialogowego, wysyła komunikat do odpowiedniego okna. Jeśli pobiera komunikat WM_QUIT, przekazuje go z powrotem do kolejki komunikatów aplikacji, aby główna pętla komunikatów aplikacji mogła ostatecznie pobrać ten komunikat.
System wysyła komunikat WM_ENTERIDLE do okna właściciela, gdy kolejka komunikatów aplikacji jest pusta. Aplikacja może użyć tego komunikatu, aby wykonać zadanie w tle, gdy okno dialogowe pozostanie na ekranie. Gdy aplikacja używa komunikatu w ten sposób, musi często zwracać kontrolę (na przykład korzystając z funkcji PeekMessage), aby modalne okno dialogowe mogło odbierać dane wejściowe od użytkownika. Aby zapobiec wysyłaniu komunikatów WM_ENTERIDLE przez modalne okno dialogowe, aplikacja może określić styl DS_NOIDLEMSG podczas tworzenia tego okna dialogowego.
Aplikacja niszczy modalne okno dialogowe przy użyciu funkcji EndDialog. W większości przypadków procedura okna dialogowego wywołuje EndDialog, gdy użytkownik kliknie Zamknij z menu okna dialogowego lub przycisk w oknie dialogowym, na przykład OK lub Anuluj. Okno dialogowe może zwrócić wartość za pomocą funkcji DialogBox (lub innych funkcji tworzenia), podając wartość podczas wywołania funkcji EndDialog. System zwraca tę wartość po zniszczeniu okna dialogowego. Większość aplikacji używa tej wartości zwracanej, aby określić, czy okno dialogowe zakończyło zadanie pomyślnie, czy zostało anulowane przez użytkownika. System nie zwraca kontroli z funkcji, która tworzy okno dialogowe, dopóki procedura okna dialogowego nie wywoła funkcji EndDialog.
Okna dialogowe bez moderowania
Okno dialogowe niemodalne powinno być wyskakującym oknem z menu okna, paskiem tytułu i cienkim obramowaniem; oznacza to, że szablon okna dialogowego powinien określać style WS_POPUP, WS_CAPTION, WS_BORDERi WS_SYSMENU. System nie wyświetla automatycznie okna dialogowego, chyba że szablon określa styl WS_VISIBLE.
Aplikacja tworzy niemedialne okno dialogowe przy użyciu funkcji CreateDialog lub funkcji CreateDialogIndirect. CreateDialog wymaga nazwy lub identyfikatora zasobu zawierającego szablon okna dialogowego; CreateDialogIndirect wymaga dojścia do obiektu pamięci zawierającego szablon okna dialogowego. Dwie inne funkcje, CreateDialogParam i CreateDialogIndirectParam, również tworzą niemodalne okna dialogowe; przekazują określony parametr do procedury okna dialogowego, kiedy okno dialogowe jest tworzone.
CreateDialog i inne funkcje tworzenia, takie jaki, zwracają uchwyt okna do okna dialogowego. Aplikacja i procedura okna dialogowego mogą używać tego uchwytu do zarządzania oknem dialogowym. Jeśli na przykład WS_VISIBLE nie jest określony w szablonie okna dialogowego, aplikacja może wyświetlić okno dialogowe, przekazując uchwyt okna do funkcji ShowWindow.
Okno dialogowe bez moderowania ani nie wyłącza okna właściciela ani nie wysyła do niego komunikatów. Podczas tworzenia okna dialogowego system sprawia, że jest to aktywne okno, ale użytkownik lub aplikacja może zmienić aktywne okno w dowolnym momencie. Jeśli okno dialogowe stanie się nieaktywne, pozostanie powyżej okna właściciela w kolejności Z, nawet jeśli okno właściciela jest aktywne.
Aplikacja jest odpowiedzialna za pobieranie i wysyłanie komunikatów wejściowych do okna dialogowego. Większość aplikacji używa głównej pętli komunikatów. Aby zezwolić użytkownikowi na przejście do kontrolek i wybranie ich za pomocą klawiatury, aplikacja musi jednak wywołać funkcję IsDialogMessage. Aby uzyskać więcej informacji na temat tej funkcji, zobacz interfejs klawiatury okna dialogowego .
Modeless okno dialogowe nie zwraca wartości do aplikacji, jak to robi modalne okno dialogowe, ale procedura okna dialogowego może przekazywać informacje do okna właściciela przy użyciu funkcji SendMessage.
Aplikacja musi zniszczyć wszystkie nierymodalne okna dialogowe przed zakończeniem. Może zniszczyć niesterowane okno dialogowe przy użyciu funkcji DestroyWindow. W większości przypadków procedura okna dialogowego wywołuje DestroyWindow w odpowiedzi na reakcję użytkownika, takie jak kliknięcie przycisku Anuluj. Jeśli użytkownik nigdy nie zamknie okna dialogowego w ten sposób, aplikacja musi wywołać DestroyWindow.
DestroyWindow unieważnia uchwyt okna dialogowego, dlatego wszelkie kolejne wywołania funkcji, które używają tego uchwytu, zwracają wartości błędów. Aby zapobiec błędom, procedura okna dialogowego powinna powiadomić właściciela, że okno dialogowe zostało zniszczone. Wiele aplikacji utrzymuje zmienną globalną zawierającą dojście do okna dialogowego. Gdy procedura okna dialogowego niszczy okno dialogowe, ustawia również zmienną globalną na null, wskazując, że okno dialogowe nie jest już prawidłowe.
Procedura okna dialogowego nie może wywołać funkcji EndDialog do zamknięcia niemodalnego okna dialogowego.
Szablony okien dialogowych
Szablon okna dialogowego to dane binarne opisujące okno dialogowe, definiujące jego wysokość, szerokość, styl i zawarte w nim kontrolki. Aby utworzyć okno dialogowe, system ładuje szablon okna dialogowego z zasobów w pliku wykonywalnym aplikacji lub używa szablonu przekazanego do niego w pamięci globalnej przez aplikację. W obu przypadkach aplikacja musi podać szablon podczas tworzenia okna dialogowego.
Deweloper tworzy zasoby szablonu przy użyciu kompilatora zasobów lub edytora okien dialogowych. Kompilator zasobów konwertuje opis tekstu na zasób binarny, a edytor okna dialogowego zapisuje interakcyjne okno dialogowe jako zasób binarny.
Notatka
Wyjaśnienie sposobu tworzenia zasobów szablonu i dodawania ich do pliku wykonywalnego aplikacji wykracza poza zakres tego przeglądu. Aby uzyskać więcej informacji na temat tworzenia zasobów szablonu i dodawania ich do pliku wykonywalnego, zobacz dokumentację dostarczoną z narzędziami do tworzenia aplikacji.
Aby utworzyć okno dialogowe bez używania zasobów szablonu, należy utworzyć szablon w pamięci i przekazać go do funkcji CreateDialogIndirectParam lub DialogBoxIndirectParam albo do makra CreateDialogIndirect lub DialogBoxIndirect.
Szablon okna dialogowego w pamięci składa się z nagłówka opisującego okno dialogowe, po którym następuje co najmniej jeden dodatkowy blok danych opisujący każdą kontrolkę w oknie dialogowym. Szablon może używać formatu standardowego lub formatu rozszerzonego. W szablonie standardowym nagłówek jest strukturą DLGTEMPLATE, a następnie dodatkowymi tablicami o zmiennej długości; a dane dla każdej kontrolki składają się z DLGITEMTEMPLATE struktury, po której następują dodatkowe tablice o zmiennej długości. W szablonie rozszerzonego okna dialogowego nagłówek używa formatu DLGTEMPLATEEX, a definicje kontrolek używają formatu DLGITEMTEMPLATEEX.
Szablon pamięci można utworzyć, przydzielając globalny obiekt pamięci i wypełniając go definicjami standardowymi lub rozszerzonymi nagłówkami i kontrolkami. Szablon pamięci jest identyczny w postaci i zawartości do zasobu szablonu. Wiele aplikacji korzystających z szablonów pamięci najpierw używa funkcji LoadResource, aby załadować zasób szablonu do pamięci, a następnie zmodyfikować załadowany zasób, aby utworzyć nowy szablon pamięci. Aby uzyskać więcej informacji na temat tworzenia szablonu okna dialogowego w pamięci, zobacz Templates in Memory.
W poniższych sekcjach opisano style, miary i inne wartości używane w szablonie okna dialogowego.
- style szablonu okna dialogowego
- Pomiary okna dialogowego
- Kontrolki okienka dialogowego
- Menu okna dialogowego
- czcionki okna dialogowego
- Szablony w Pamięci
Style szablonu okna dialogowego
Każdy szablon okna dialogowego określa kombinację wartości stylu, które definiują wygląd i funkcje okna dialogowego. Wartości stylu mogą być stylami okien, takimi jak WS_POPUP i WS_SYSMENU, oraz style okien dialogowych, takie jak DS_MODALFRAME. Liczba i typ stylów szablonu zależą od typu i przeznaczenia okna dialogowego. Aby uzyskać listę wartości, zobacz style okna dialogowego .
System przekazuje wszystkie style okien określone w szablonie do funkcji CreateWindowEx podczas tworzenia okna dialogowego. System może przekazać jeden lub więcej stylów rozszerzonych w zależności od określonych stylów okna dialogowego. Na przykład gdy szablon określa DS_MODALFRAME, system używa WS_EX_DLGMODALFRAME podczas tworzenia okna dialogowego.
Większość okien dialogowych to wyskakujące okna, które mają menu okna i pasek tytułu. W związku z tym typowy szablon określa style WS_POPUP, WS_SYSMENUi WS_CAPTION. Szablon określa także styl obramowania: WS_BORDER dla niemodalnych okien dialogowych i DS_MODALFRAME dla modalnych okien dialogowych. Szablon może określać typ okna inny niż wyskakujące okienko (na przykład WS_OVERLAPPED), jeśli tworzy dostosowane okno zamiast okna dialogowego.
System zawsze wyświetla modalne okno dialogowe niezależnie od tego, czy określono styl WS_VISIBLE. Gdy szablon okna dialogowego bez moderowania określa styl WS_VISIBLE, system automatycznie wyświetla okno dialogowe po jego utworzeniu. W przeciwnym razie aplikacja jest odpowiedzialna za wyświetlanie okna dialogowego przy użyciu funkcji ShowWindow.
Miary okna dialogowego
Każdy szablon okna dialogowego zawiera miary określające położenie, szerokość i wysokość okna dialogowego oraz zawarte w nim kontrolki. Te pomiary są niezależne od urządzenia, więc aplikacja może użyć jednego szablonu do utworzenia tego samego okna dialogowego dla wszystkich typów urządzeń wyświetlania. Dzięki temu okno dialogowe będzie miało takie same proporcje i wygląd na wszystkich ekranach, pomimo różnych rozdzielczości i współczynników proporcji między ekranami.
Miary w szablonie okna dialogowego są określane w jednostkach szablonu okna dialogowego. Aby przekonwertować miary z jednostek szablonu okna dialogowego na jednostki ekranu (piksele), użyj funkcji MapDialogRect, która uwzględnia czcionkę używaną przez okno dialogowe i poprawnie konwertuje prostokąt z jednostek szablonu okna dialogowego na piksele. W przypadku okien dialogowych używających czcionki systemowej można użyć funkcji GetDialogBaseUnits do samodzielnego wykonywania obliczeń konwersji, chociaż użycie MapDialogRect jest prostsze.
Szablon musi określać początkowe współrzędne lewego górnego rogu okna dialogowego. Zazwyczaj współrzędne są określane w odniesieniu do lewego górnego rogu obszaru klienta okna właściciela. Gdy szablon określa styl DS_ABSALIGN lub okno dialogowe nie ma właściciela, pozycja jest względna względem lewego górnego rogu ekranu. System ustawia tę początkową pozycję podczas tworzenia okna dialogowego, ale umożliwia aplikacji dostosowanie położenia przed wyświetleniem okna dialogowego. Na przykład aplikacja może pobrać wymiary okna właściciela, obliczyć nowe położenie, które wyśrodkuje okno dialogowe w oknie właściciela, a następnie ustawić pozycję przy użyciu funkcji SetWindowPos.
Szablon powinien określać szerokość i wysokość okna dialogowego, które nie przekracza szerokości i wysokości ekranu oraz zapewnia, że wszystkie kontrolki znajdują się w obszarze klienta okna dialogowego. Mimo że system zezwala na dowolne rozmiary okna dialogowego, utworzenie takiego, który jest zbyt mały lub zbyt duży, może uniemożliwić użytkownikowi dostarczanie danych wejściowych, pokonując cel okna dialogowego. Wiele aplikacji używa więcej niż jednego okna dialogowego, gdy istnieje duża liczba kontrolek. W takich przypadkach początkowe okno dialogowe zwykle zawiera jeden lub więcej przycisków, które użytkownik może wybrać, aby wyświetlić następne okno dialogowe.
Kontrolki okna dialogowego
Szablon określa położenie, szerokość, wysokość, styl, identyfikator i klasę okna dla każdej kontrolki w oknie dialogowym. System tworzy każdą kontrolkę, przekazując te dane do funkcji CreateWindowEx. Kontrolki są tworzone w kolejności, w której są określone w szablonie. Szablon powinien określać odpowiednią liczbę, typ i kolejność kontrolek, aby upewnić się, że użytkownik może wprowadzić dane wejściowe potrzebne do ukończenia zadania skojarzonego z okno dialogowe.
Dla każdej kontrolki szablon określa wartości stylu, które definiują wygląd i działanie kontrolki. Każda kontrolka jest oknem podrzędnym i dlatego musi mieć styl WS_CHILD. Aby upewnić się, że kontrolka jest widoczna po wyświetleniu okna dialogowego, każda kontrolka musi mieć również styl WS_VISIBLE. Inne powszechnie używane style okien są WS_BORDER dla kontrolek, które mają opcjonalne obramowania, WS_DISABLED dla kontrolek, które powinny być wyłączone po początkowym utworzeniu okna dialogowego, a WS_TABSTOP i WS_GROUP dla kontrolek, do których można uzyskać dostęp za pomocą klawiatury. Style WS_TABSTOP i WS_GROUP są używane w połączeniu z interfejsem klawiatury okna dialogowego opisanym w dalszej części tego tematu.
Szablon może również określać style kontrolek specyficzne dla klasy okna kontrolki. Na przykład szablon określający kontrolkę przycisku musi nadać styl kontrolki przycisku, taki jak BS_PUSHBUTTON lub BS_CHECKBOX. System przekazuje style kontrolek do procedury okna sterowania za pośrednictwem komunikatu WM_CREATE, umożliwiając procedurze dostosowanie wyglądu i działania kontrolki.
System konwertuje współrzędne położenia oraz pomiary szerokości i wysokości z jednostek bazowych okna dialogowego na piksele przed przekazaniem ich do CreateWindowEx. Gdy system tworzy kontrolkę, określa okno dialogowe jako okno nadrzędne. Oznacza to, że system zawsze interpretuje współrzędne położenia kontrolki jako współrzędne klienta względem lewego górnego rogu obszaru klienta okna dialogowego.
Szablon określa klasę okna dla każdej kontrolki. Typowe okno dialogowe zawiera kontrolki należące do wstępnie zdefiniowanych klas okien kontrolek, takich jak przycisk i edytowanie klas okien sterowania. W tym przypadku szablon określa klasy okien, podając odpowiednie wstępnie zdefiniowane wartości atomów dla klas. Gdy okno dialogowe zawiera kontrolkę należącą do niestandardowej klasy okna sterowania, szablon nadaje nazwę tej zarejestrowanej klasy okna lub wartość atomu skojarzoną obecnie z nazwą.
Każda kontrolka w oknie dialogowym musi mieć unikatowy identyfikator, aby odróżnić ją od innych kontrolek. Kontrolki wysyłają informacje do procedury okna dialogowego za pośrednictwem komunikatów WM_COMMAND, więc identyfikatory kontrolek są niezbędne dla procedury w celu określenia, która kontrolka wysłała określony komunikat. Jedynym wyjątkiem od tej reguły są identyfikatory kontrolek dla kontrolek statycznych. Kontrolki statyczne nie wymagają unikatowych identyfikatorów, ponieważ nie wysyłają żadnych komunikatów WM_COMMAND.
Aby zezwolić użytkownikowi na zamknięcie okna dialogowego, szablon powinien określić co najmniej jeden przycisk wypychania i nadać mu identyfikator kontrolki IDCANCEL. Aby zezwolić użytkownikowi na wybór między ukończeniem lub anulowaniem zadania skojarzonego z oknem dialogowym, szablon powinien określić dwa przyciski wypychania z etykietą OK i Anulujz identyfikatorami kontroli IDOK i IDCANCEL.
Szablon określa również opcjonalny tekst i dane tworzenia dla kontrolki. Tekst zazwyczaj zawiera etykiety dla kontrolek przycisków lub określa początkową zawartość statycznego tekstu. Dane tworzenia to jeden lub więcej bajtów danych, które system przekazuje do procedury okna kontrolki podczas tworzenia kontrolki. Dane tworzenia są przydatne w przypadku kontrolek wymagających większej ilości informacji o początkowej zawartości lub stylu, niż są określone przez inne dane. Na przykład aplikacja może użyć danych tworzenia, aby ustawić początkowe ustawienie i zakres dla kontrolki paska przewijania.
Menu okna dialogowego
System udostępnia okno dialogowe menu okna, gdy szablon określa styl WS_SYSMENU. Aby zapobiec nieodpowiedniemu wprowadzaniu, system automatycznie wyłącza wszystkie pozycje w menu z wyjątkiem Przenieś i Zamknij. Użytkownik może kliknąć Przenieś, aby przenieść okno dialogowe. Gdy użytkownik kliknie Zamknij, system wysyła komunikat WM_COMMAND do procedury okna dialogowego z parametrem wParam ustawionym na IDCANCEL. Jest to identyczne z komunikatem wysłanym przez przycisk Anuluj po kliknięciu go przez użytkownika. Zalecaną akcją dla tego komunikatu jest zamknięcie okna dialogowego i anulowanie żądanego zadania.
Chociaż inne menu w oknach dialogowych nie są zalecane, szablon okna dialogowego może określić menu, podając identyfikator lub nazwę zasobu menu. W takim przypadku system ładuje zasób i tworzy menu dla okna dialogowego. Aplikacje zazwyczaj używają identyfikatorów menu lub nazw w szablonach podczas używania szablonów do tworzenia niestandardowych okien, a nie okien dialogowych.
Czcionki okna dialogowego
System używa średniej szerokości znaków czcionki okna dialogowego do obliczania położenia i wymiarów okna dialogowego. Domyślnie system rysuje cały tekst w oknie dialogowym przy użyciu czcionki SYSTEM_FONT.
Aby określić czcionkę okna dialogowego innego niż domyślna, należy utworzyć okno dialogowe przy użyciu szablonu okna dialogowego. W zasobie szablonu użyj instrukcji FONT. W szablonie okna dialogowego ustaw styl DS_SETFONT lub DS_SHELLFONT i określ rozmiar punktu oraz nazwę czcionki. Nawet jeśli szablon okna dialogowego określa czcionkę w ten sposób, system zawsze używa czcionki systemowej dla tytułu okna dialogowego i menu okna dialogowego.
Gdy okno dialogowe ma styl DS_SETFONT lub DS_SHELLFONT, system wysyła komunikat WM_SETFONT do procedury okna dialogowego i do każdej kontrolki podczas tworzenia kontrolki. Procedura okna dialogowego jest odpowiedzialna za przechowywanie uchwytu czcionki przekazanego za pomocą komunikatu WM_SETFONT i wybranie uchwytu w kontekście urządzenia wyświetlania za każdym razem, gdy w oknie umieszczany jest tekst. Wstępnie zdefiniowane kontrolki robią to domyślnie.
Czcionka systemowa może się różnić w zależności od różnych wersji systemu Windows. Aby aplikacja używała czcionki systemowej niezależnie od tego, na którym systemie działa, użyj DS_SHELLFONT z typeface MS Shell Dlg i użyj DIALOGEX Resource zamiast DIALOG Resource. System mapuje ten krój pisma w taki sposób, aby okno dialogowe używało czcionki Tahoma. Należy pamiętać, że DS_SHELLFONT nie ma wpływu, jeśli czcionka nie jest MS Shell Dlg.
Szablony w pamięci
Szablon okna dialogowego w pamięci składa się z nagłówka opisującego okno dialogowe, po którym następuje co najmniej jeden dodatkowy blok danych opisujący każdą kontrolkę w oknie dialogowym. Szablon może używać formatu standardowego lub formatu rozszerzonego. W szablonie standardowym nagłówek jest strukturą DLGTEMPLATE, a następnie dodatkowymi tablicami o zmiennej długości. Dane dla każdej kontrolki składają się ze struktury DLGITEMTEMPLATE, po której następują dodatkowe tablice o zmiennej długości. W szablonie rozszerzonego okna dialogowego nagłówek używa formatu DLGTEMPLATEEX, a definicje kontrolek używają formatu DLGITEMTEMPLATEEX.
Aby odróżnić szablon standardowy od szablonu rozszerzonego, sprawdź pierwsze 16 bity szablonu okna dialogowego. W rozszerzonym szablonie pierwszy WORD jest 0xFFFF; każda inna wartość wskazuje na standardowy szablon.
Jeśli tworzysz szablon okna dialogowego w pamięci, musisz upewnić się, że każda z definicji kontrolek DLGITEMTEMPLATE lub DLGITEMTEMPLATEEX są wyrównane do granic DWORD. Ponadto wszystkie dane tworzenia, które są zgodne z definicją kontrolki, muszą być wyrównane do granicy DWORD. Wszystkie inne tablice o zmiennej długości w szablonie okna dialogowego muszą być wyrównane na granicach WORD.
Nagłówek szablonu
Zarówno w standardowych, jak i rozszerzonych szablonach dla okien dialogowych nagłówek zawiera następujące ogólne informacje:
- Lokalizacja i wymiary okna dialogowego
- Style okna i styl okna dialogowego
- Liczba kontrolek w oknie dialogowym. Ta wartość określa liczbę DLGITEMTEMPLATE lub DLGITEMTEMPLATEEX definicji kontroli w szablonie.
- Opcjonalny zasób menu dla okna dialogowego. Szablon może wskazywać, że okno dialogowe nie ma menu lub może określić wartość porządkową lub ciąg Unicode o wartości null, który identyfikuje zasób menu w pliku wykonywalnym.
- Klasa okna okna dialogowego. Może to być wstępnie zdefiniowana klasa okna dialogowego lub wartość porządkowa lub ciąg Unicode o wartości null, który identyfikuje zarejestrowaną klasę okna.
- Ciąg Unicode zakończony wartością null, który określa tytuł okna dialogowego. Jeśli ciąg jest pusty, pasek tytułu okna dialogowego jest pusty. Jeśli okno dialogowe nie ma stylu WS_CAPTION, system ustawia tytuł na określony ciąg, ale nie wyświetla go.
- Jeśli okno dialogowe ma styl DS_SETFONT, nagłówek określa rozmiar punktu i nazwę czcionki do użycia dla tekstu w obszarze klienta i kontrolki okna dialogowego.
W szablonie rozszerzonym nagłówek DLGTEMPLATEEX określa również następujące dodatkowe informacje:
- Identyfikator kontekstu pomocy okna dialogowego, gdy system wysyła komunikat WM_HELP.
- Jeśli okno dialogowe ma styl DS_SETFONT lub DS_SHELLFONT, nagłówek określa wagę czcionki i wskazuje, czy czcionka jest kursywa.
Definicje kontrolek
Po nagłówku szablonu znajduje się co najmniej jedna definicja kontrolki, która opisuje kontrolki okna dialogowego. W szablonach standardowych i rozszerzonych nagłówek okna dialogowego zawiera człon wskazujący liczbę definicji kontrolek w szablonie. W szablonie standardowym każda definicja kontrolki składa się z DLGITEMTEMPLATE struktury, po której następują dodatkowe tablice o zmiennej długości. W szablonie rozszerzonym definicje kontrolek używają formatu DLGITEMTEMPLATEEX.
W szablonach standardowych i rozszerzonych definicja kontrolki zawiera następujące informacje:
- Lokalizacja i wymiary kontrolki.
- Style okna i elementu sterującego dla kontrolki.
- Identyfikator kontrolki.
- Klasa okna kontrolki. Może to być wartość porządkowa wstępnie zdefiniowanej klasy systemowej lub ciąg Unicode o wartości null, który określa nazwę zarejestrowanej klasy okna.
- Ciąg Unicode zakończony wartością null, który określa początkowy tekst kontrolki lub wartość porządkową identyfikującą zasób, taki jak ikona, w pliku wykonywalnym.
- Opcjonalny blok danych tworzenia o zmiennej długości. Kiedy system tworzy kontrolkę, przekazuje wskaźnik do tych danych w parametrze lParam komunikatu WM_CREATE wysyłanego do kontrolki.
W szablonie rozszerzonym definicja kontrolki określa również identyfikator kontekstu pomocy dla kontrolki, gdy system wysyła komunikat WM_HELP.