Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym omówieniu omówiono niektóre zagadnienia dotyczące programowania dotyczące okien dialogowych.
Omówienie zawiera następujące tematy.
- procedury okna dialogowego
- Interfejs klawiaturowy okna dialogowego
- ustawienia okna dialogowego
- niestandardowe okna dialogowe
Procedury okna dialogowego
Procedura okna dialogowego jest podobna do procedury okna, w której system wysyła komunikaty do procedury, gdy zawiera informacje, które należy przekazać lub wykonać zadania. W przeciwieństwie do procedury okna procedura okna dialogowego nigdy nie wywołuje funkcji DefWindowProc. Zamiast tego zwraca true, jeśli przetwarza komunikat lub false, jeśli nie.
Każda procedura okna dialogowego ma następującą postać:
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
// Place message cases here.
default:
return FALSE;
}
}
Parametry procedury służą do tego samego celu, co w procedurze okna, przy czym parametr hwndDlg odbiera uchwyt okna dialogowego.
Większość procedur okna dialogowego przetwarza komunikat WM_INITDIALOG oraz komunikaty WM_COMMAND wysyłane przez kontrolki, ale przetwarza niewiele innych komunikatów, jeśli w ogóle. Jeśli procedura okna dialogowego nie przetwarza komunikatu, musi zwrócić wartość FALSE, tak aby skierować system do wewnętrznego przetwarzania komunikatów. Jedynym wyjątkiem od tej reguły jest komunikat WM_INITDIALOG. Procedura okna dialogowego musi zwrócić TRUE, aby umożliwić systemowi dalsze przetwarzanie komunikatu WM_INITDIALOG. W każdym razie procedura nie może wywołać DefWindowProc.
- Komunikat WM_INITDIALOG
- Komunikat WM_COMMAND
- Komunikat WM_PARENTNOTIFY
- Control-Color wiadomości
- okno dialogowe Domyślne przetwarzanie komunikatów
Komunikat WM_INITDIALOG
System nie wysyła komunikatu WM_CREATE do procedury okna dialogowego. Zamiast tego wysyła komunikat WM_INITDIALOG podczas tworzenia okna dialogowego i wszystkich kontrolek, ale przed wyświetleniem okna dialogowego. Procedura powinna wykonać dowolną inicjację wymaganą, aby upewnić się, że w oknie dialogowym są wyświetlane bieżące ustawienia skojarzone z zadaniem. Jeśli na przykład okno dialogowe zawiera kontrolkę, aby wyświetlić bieżący dysk i katalog, procedura musi określić bieżący dysk i katalog i ustawić kontrolkę na wartość.
Procedura może zainicjować kontrolki za pomocą funkcji, takich jak SetDlgItemText oraz CheckDlgButton. Ponieważ kontrolki są oknami, procedura może również manipulować nimi za pomocą funkcji zarządzania oknami, takich jak EnableWindow i SetFocus. Procedura może pobrać uchwyt okna do kontrolki przy użyciu funkcji GetDlgItem.
Procedura okna dialogowego umożliwia zmianę zawartości, stanu i położenia dowolnej kontrolki zgodnie z potrzebami. Na przykład w oknie dialogowym zawierającym pole listy nazw plików i przycisk Otwórz procedura może wyłączyć przycisk Otwórz, dopóki użytkownik nie wybierze pliku z listy. W tym przykładzie szablon okna dialogowego określa styl WS_DISABLED dla przycisku Otwórz, a system automatycznie wyłącza przycisk podczas jego tworzenia. Gdy procedura okna dialogowego odbiera komunikat powiadomienia z listy wskazujący, że użytkownik wybrał plik, procedura wywołuje funkcję EnableWindow, aby włączyć przycisk Otwórz.
Aby wyświetlić ikonę niestandardową na pasku podpisów okna dialogowego, program obsługi WM_INITDIALOG może wysłać komunikat WM_SETICON do okna dialogowego.
Jeśli aplikacja tworzy okno dialogowe przy użyciu jednej z funkcji DialogBoxParam, DialogBoxIndirectParam, CreateDialogParamlub CreateDialogIndirectParam, parametr lParam dla komunikatu WM_INITDIALOG zawiera dodatkowy parametr przekazany do funkcji. Aplikacje zazwyczaj używają tego dodatkowego parametru, aby przekazać wskaźnik do dodatkowych informacji inicjalizacji do procedury okna dialogowego, ale procedura okna dialogowego musi określić znaczenie parametru. Jeśli aplikacja używa innej funkcji do utworzenia okna dialogowego, system ustawia parametr lParamnull.
Przed powrotem z komunikatu WM_INITDIALOG procedura powinna określić, czy należy ustawić fokus wejściowy na określoną kontrolkę. Jeśli procedura okna dialogowego zwraca TRUE, system automatycznie ustawia fokus wejściowy na kontrolkę, której uchwyt okna znajduje się w parametrze wParam. Jeśli kontrolka otrzymująca fokus domyślny nie jest właściwa, można ustawić fokus na odpowiednią kontrolkę przy użyciu funkcji SetFocus. Jeśli procedura ustawia fokus wejściowy, musi zwrócić FALSE, aby uniemożliwić systemowi ustawienie domyślnego fokusu. Kontrolka odbierającą domyślny fokus wejściowy jest zawsze pierwszą kontrolką określoną w szablonie widocznym, a nie wyłączonym i ma styl WS_TABSTOP. Jeśli taka kontrolka nie istnieje, system ustawia domyślny fokus wejściowy na pierwszą kontrolkę w szablonie.
Komunikat WM_COMMAND
Kontrolka może wysyłać komunikat WM_COMMAND do procedury okna dialogowego, gdy użytkownik wykonuje akcję w kontrolce. Te komunikaty, nazywane komunikatami powiadomień, informują o procedurze wprowadzania danych przez użytkownika i umożliwiają wykonywanie odpowiednich odpowiedzi.
Wszystkie wstępnie zdefiniowane kontrolki, z wyjątkiem kontrolek statycznych, wysyłają komunikaty powiadomień dla wybranych akcji użytkownika. Na przykład przycisk wysyła komunikat zawiadamiający BN_CLICKED za każdym razem, gdy użytkownik kliknie przycisk. We wszystkich przypadkach młodsze słowo parametru wParam zawiera identyfikator kontroli, starsze słowo wParam zawiera kod powiadomienia, a parametr lParam zawiera uchwyt okna kontrolnego.
Procedura okna dialogowego powinna monitorować i przetwarzać komunikaty powiadomień. W szczególności procedura musi przetwarzać komunikaty o identyfikatorach IDOK lub IDCANCEL; te komunikaty reprezentują żądanie od użytkownika w celu zamknięcia okna dialogowego. Procedura powinna zamknąć okno dialogowe przy użyciu funkcji EndDialog do zamykania modalnych okien dialogowych i funkcji DestroyWindow dla niemedialnych okien dialogowych.
System wysyła również komunikat WM_COMMAND do procedury okna dialogowego, jeśli okno dialogowe zawiera menu, takie jak menu okna , a użytkownik klika element menu. W szczególności system wysyła komunikat WM_COMMAND z parametrem wParam ustawionym na IDCANCEL za każdym razem, gdy użytkownik kliknie Zamknij w menu okna dialogowego. Komunikat jest prawie identyczny z komunikatem z powiadomieniem wysyłanym przez przycisk Anuluj i powinien być przetwarzany w dokładnie taki sam sposób.
Komunikat WM_PARENTNOTIFY
Kontrolka wysyła komunikat WM_PARENTNOTIFY za każdym razem, gdy użytkownik naciska przycisk myszy, wskazując kontrolkę. Niektóre aplikacje interpretują ten komunikat jako sygnał do wykonania akcji związanej z kontrolką, na przykład wyświetlania wiersza tekstu opisującego przeznaczenie kontrolki.
System wysyła również komunikaty WM_PARENTNOTIFY podczas tworzenia i usuwania okna, ale nie dla kontrolek pochodzących z szablonu okna dialogowego. System zapobiega tym komunikatom, określając styl WS_EX_NOPARENTNOTIFY podczas tworzenia kontrolek. Aplikacja nie może zastąpić tego domyślnego zachowania, chyba że tworzy własne kontrolki dla okna dialogowego.
Komunikaty Control-Color
Kontrolki i system mogą wysyłać komunikaty w kolorze sterowania, gdy chcą, aby procedura okna dialogowego malowała tło kontrolki lub innego okna przy użyciu określonego pędzla i kolorów. Może to być przydatne, gdy aplikacje zastępują kolory domyślne używane w oknach dialogowych i ich kontrolkach. Poniżej przedstawiono komunikaty w kolorze sterowania, które zastąpiły komunikat WM_CTLCOLOR.
- WM_CTLCOLORBTN
- WM_CTLCOLORDLG
- WM_CTLCOLOREDIT
- WM_CTLCOLORLISTBOX
- WM_CTLCOLORSCROLLBAR
- WM_CTLCOLORSTATIC
Kontrolka wysyła komunikat sterowania kolorem do procedury okna dialogowego tuż przed pomalowaniem własnego tła. Komunikat umożliwia procedurę określania pędzla do użycia i ustawiania kolorów tła i pierwszego planu. Procedura określa szczotkę, zwracając uchwyt szczotki. Aby ustawić kolory tła i tekstu, procedura używa funkcji SetBkColor i SetTextColor w kontekście urządzenia wyświetlającego kontrolkę. Komunikat w kolorze sterowania przekazuje uchwyt do kontekstu urządzenia wyświetlania do procedury w parametrze wParam komunikatu.
System wysyła komunikat WM_CTLCOLORDLG do procedury okna dialogowego, jeśli procedura nie przetwarza komunikatu WM_ERASEBKGND. Wstępnie zdefiniowana klasa okienka dialogowego nie ma pędzla tła klasy, więc ten komunikat pozwala procedurze zdefiniować własne tło bez potrzeby dodawania kodu do wykonania zadania.
W każdym razie, gdy procedura okna dialogowego nie przetwarza komunikatu w kolorze kontrolki, system używa pędzla z domyślnym kolorem okna do malowania tła dla wszystkich kontrolek i okien z wyjątkiem pasków przewijania. Aplikacja może pobrać domyślny kolor okna, przekazując wartość COLOR_WINDOW do funkcji GetSysColor. Podczas malowania tła kolor pierwszego planu dla kontekstu urządzenia wyświetlania jest ustawiony na domyślny kolor tekstu (COLOR_WINDOWTEXT). W przypadku pasków przewijania system używa pędzla o domyślnym kolorze paska przewijania (COLOR_SCROLLBAR). W takim przypadku kolory tła i pierwszego planu dla kontekstu urządzenia wyświetlania są ustawione odpowiednio na białe i czarne.
Domyślne przetwarzanie komunikatów w oknie dialogowym
Procedura okna dla wstępnie zdefiniowanej klasy okna dialogowego wykonuje domyślne przetwarzanie dla wszystkich komunikatów, które procedura okna dialogowego nie przetwarza. Gdy procedura okna dialogowego zwraca false dla dowolnego komunikatu, wstępnie zdefiniowana procedura okna sprawdza komunikaty i wykonuje następujące akcje domyślne:
| Komunikat | Akcja domyślna |
|---|---|
| DM_GETDEFID | Tę wiadomość można wysłać do okna dialogowego. Okno dialogowe zwraca identyfikator kontrolki domyślnego przycisku push, jeśli okno dialogowe ma jeden; w przeciwnym razie zwraca zero. |
| DM_REPOSITION | Tę wiadomość można wysłać do okna dialogowego najwyższego poziomu. Okno dialogowe zmienia położenie, tak aby mieściło się w obszarze pulpitu. |
| DM_SETDEFID | Tę wiadomość można wysłać do okna dialogowego. Okno dialogowe ustawia domyślny przycisk wypychania do kontrolki określonej przez identyfikator kontrolki w parametrze wParam. |
| WM_ACTIVATE | Przywraca fokus danych wejściowych do kontrolki zidentyfikowanej przez wcześniej zapisany uchwyt, jeśli zostanie aktywowane okno dialogowe. W przeciwnym razie procedura zapisuje uchwyt w kontrolce z fokusem wejściowym. |
| WM_CHARTOITEM | Zwraca zero. |
| WM_CLOSE | Publikuje komunikat powiadomienia BN_CLICKED do okna dialogowego, określając IDCANCEL jako identyfikator kontrolki. Jeśli okno dialogowe ma identyfikator kontrolki IDCANCEL, a kontrolka jest obecnie wyłączona, procedura wydaje ostrzeżenie i nie wysyła komunikatu. |
| WM_COMPAREITEM | Zwraca zero. |
| WM_ERASEBKGND | Wypełnia obszar klienta okna dialogowego przy użyciu pędzla zwróconego z komunikatu WM_CTLCOLORDLG lub przy użyciu domyślnego koloru okna. |
| WM_GETFONT | Zwraca uchwyt do czcionki zdefiniowanej przez aplikację dla okna dialogowego. |
| WM_INITDIALOG | Zwraca zero. |
| WM_LBUTTONDOWN | Wysyła komunikat CB_SHOWDROPDOWN do pola kombi z fokusem wejściowym, kierując kontrolkę w celu ukrycia pola listy rozwijanej. Procedura wywołuje DefWindowProc, aby ukończyć akcję domyślną. |
| WM_NCDESTROY | Zwalnia pamięć globalną przydzieloną do kontrolek edycji w oknie dialogowym (dotyczy okien dialogowych określających styl DS_LOCALEDIT) i zwalnia dowolną czcionkę zdefiniowaną przez aplikację (dotyczy okien dialogowych określających styl DS_SETFONT lub DS_SHELLFONT). Procedura wywołuje funkcję DefWindowProc, aby ukończyć akcję domyślną. |
| WM_NCLBUTTONDOWN | Wysyła komunikat CB_SHOWDROPDOWN do pola kombi z fokusem wejściowym, kierując kontrolkę w celu ukrycia pola listy rozwijanej. Procedura wywołuje DefWindowProc, aby ukończyć akcję domyślną. |
| WM_NEXTDLGCTL | Ustawia fokus wejścia na następną lub poprzednią kontrolkę w oknie dialogowym, na kontrolkę zidentyfikowaną przez uchwyt w parametrze wParam lub na pierwszą kontrolkę w oknie dialogowym, która jest widoczna, nie jest wyłączona i ma styl WS_TABSTOP. Procedura ignoruje ten komunikat, jeśli bieżące okno z fokusem wejściowym nie jest kontrolką. |
| WM_SETFOCUS | Ustawia fokus danych wejściowych na kontrolkę zidentyfikowaną przez wcześniej zapisany uchwyt okna sterowania. Jeśli taki uchwyt nie istnieje, procedura ustawia fokus wejściowy na pierwszą kontrolkę w szablonie okna dialogowego, który jest widoczny, a nie wyłączony i ma styl WS_TABSTOP. Jeśli taka kontrolka nie istnieje, procedura ustawia fokus wejściowy na pierwszą kontrolkę w szablonie. |
| WM_SHOWWINDOW | Zapisuje uchwyt do kontrolki mającej fokus wejściowy, jeśli okno dialogowe jest chowane, a następnie wywołuje DefWindowProc, aby ukończyć akcję domyślną. |
| WM_SYSCOMMAND | Zapisuje dojście do kontrolki z fokusem wejściowym, jeśli okno dialogowe jest zminimalizowane, a następnie wywołuje DefWindowProc, aby ukończyć akcję domyślną. |
| WM_VKEYTOITEM | Zwraca zero. |
Wstępnie zdefiniowana procedura okna przekazuje wszystkie inne komunikaty do DefWindowProc na potrzeby przetwarzania domyślnego.
Interfejs klawiatury okna dialogowego
System zapewnia specjalny interfejs klawiatury dla okien dialogowych, który wykonuje specjalne przetwarzanie dla kilku klawiszy. Interfejs generuje komunikaty, które odpowiadają określonym przyciskom w oknie dialogowym lub zmienia fokus wejściowy z jednej kontrolki na inną. Poniżej przedstawiono klucze używane w tym interfejsie i ich odpowiednie akcje.
| Klucz | Akcja |
|---|---|
| ALT+mnemotechniczny | Przenosi fokus wejściowy do pierwszego elementu sterującego (o stylu WS_TABSTOP) po elemencie statycznym zawierającym określony mnemonik. |
| Na dół | Przenosi fokus danych wejściowych do następnej kontrolki w grupie. |
| WEJŚĆ | Wysyła komunikat WM_COMMAND do procedury okna dialogowego. Parametr wParam jest ustawiony na idOK lub identyfikator kontrolki domyślnego przycisku wypychania. |
| ESC | Wysyła komunikat WM_COMMAND do procedury okna dialogowego. Parametr wParam jest ustawiony na wartość IDCANCEL. |
| LEWY | Przenosi fokus wejściowy do poprzedniej kontrolki w grupie. |
| mnemonik | Przenosi fokus wejściowy do pierwszego przycisku o stylu WS_TABSTOP, który znajduje się po kontrolce statycznej zawierającej określony mnemonik. |
| PRAWY | Przenosi fokus danych wejściowych do następnej kontrolki w grupie. |
| SHIFT+TAB | Przenosi fokus wejściowy do poprzedniej kontrolki mającej styl WS_TABSTOP. |
| ZAKŁADKA | Przenosi fokus wejściowy do następnego elementu sterującego, który ma styl WS_TABSTOP. |
| W górę | Przenosi fokus danych wejściowych do poprzedniej kontrolki w grupie. |
System automatycznie udostępnia interfejs klawiatury dla wszystkich modalnych okien dialogowych. Nie udostępnia interfejsu dla nienarzucających się okien dialogowych, chyba że aplikacja wywołuje funkcję IsDialogMessage w celu filtrowania komunikatów w głównej pętli komunikacyjnej. Oznacza to, że aplikacja musi przekazać komunikat do IsDialogMessage natychmiast po pobraniu komunikatu z kolejki komunikatów. Funkcja przetwarza komunikaty, jeśli są one przeznaczone dla okna dialogowego, i zwraca wartość niezerową, aby wskazać, że komunikat został przetworzony i nie powinien być przekazywany do funkcji TranslateMessage lub DispatchMessage.
Ponieważ interfejs klawiatury okna dialogowego używa klawiszy strzałek do przechodzenia między kontrolkami w oknie dialogowym, aplikacja nie może używać tych klawiszy do przewijania zawartości dowolnego modalnego okna dialogowego lub dowolnego niemodalnego okna dialogowego, dla którego wywoływana jest IsDialogMessage. Gdy okno dialogowe zawiera paski przewijania, aplikacja musi udostępnić alternatywny interfejs klawiatury pasków przewijania. Należy pamiętać, że interfejs myszy do przewijania jest dostępny, gdy system zawiera mysz.
Styl WS_TABSTOP
Styl WS_TABSTOP określa kontrolki, które użytkownik może przenosić, naciskając TAB lub SHIFT+TAB.
Gdy użytkownik naciska TAB lub SHIFT+TAB, system najpierw określa, czy te klucze są przetwarzane przez kontrolkę, która obecnie ma fokus wejściowy. Wysyła on kontrolce komunikat WM_GETDLGCODE, a jeśli kontrolka zwróci DLGC_WANTTAB, system przekazuje klawisze do kontrolki. W przeciwnym razie system używa funkcji GetNextDlgTabItem w celu zlokalizowania następnej kontrolki, która jest widoczna, a nie wyłączona i ma styl WS_TABSTOP. Wyszukiwanie rozpoczyna się od kontrolki, która obecnie ma fokus wejściowy i przechodzi w kolejności, w jakiej zostały utworzone kontrolki — czyli kolejności, w jakiej są zdefiniowane w szablonie okna dialogowego. Gdy system lokalizuje kontrolkę o wymaganych cechach, system przenosi do niego fokus wejściowy.
Jeśli wyszukiwanie następnej kontrolki ze stylem WS_TABSTOP napotka okno ze stylem WS_EX_CONTROLPARENT, system rekursywnie wyszukuje dzieci okna.
Aplikacja może również używać GetNextDlgTabItem do lokalizowania kontrolek mających styl WS_TABSTOP. Funkcja pobiera uchwyt okna następnej lub poprzedniej kontrolki o stylu WS_TABSTOP bez przenoszenia fokusu wejściowego.
Styl WS_GROUP
Domyślnie system przenosi fokus wejściowy do następnej lub poprzedniej kontrolki za każdym razem, gdy użytkownik naciska kierunkowy. Jeśli bieżąca kontrolka z fokusem wejściowym nie przetwarza tych kluczy, a następna lub poprzednia kontrolka nie jest statyczną kontrolką, system nadal przenosi fokus wejściowy przez wszystkie kontrolki w oknie dialogowym, ponieważ użytkownik nadal naciska kierunkowe.
Aplikacja może użyć stylu WS_GROUP, aby zmodyfikować to domyślne zachowanie. Styl oznacza początek grupy kontrolek. Jeśli kontrolka w grupie ma fokus wejściowy, gdy użytkownik zacznie naciskać klawisze kierunkowe, fokus pozostaje w grupie. Ogólnie rzecz biorąc, pierwsza kontrolka w grupie musi mieć styl WS_GROUP, a wszystkie inne kontrolki w grupie nie mogą mieć tego stylu. Wszystkie kontrolki w grupie muszą być ciągłe — oznacza to, że muszą zostać utworzone kolejno bez interweniujących kontrolek.
Gdy użytkownik naciska klawisz kierunkowy, system najpierw określa, czy bieżąca kontrola mająca fokus wejściowy przetwarza klawisze kierunkowe. System wysyła komunikat WM_GETDLGCODE do kontrolki, a jeśli kontrolka zwraca wartość DLGC_WANTARROWS, przekazuje klucz do kontrolki. W przeciwnym razie system używa funkcji GetNextDlgGroupItem w celu określenia następnej kontrolki w grupie.
GetNextDlgGroupItem przeszukuje kontrolki w kolejności (lub odwrotnej), w jakiej zostały utworzone. Jeśli użytkownik naciśnie klawisz RIGHT lub DOWN, GetNextDlgGroupItem zwróci następny element sterujący, jeśli ten element nie ma stylu WS_GROUP. W przeciwnym razie funkcja odwraca kolejność wyszukiwania i zwraca pierwszą kontrolkę, która ma styl WS_GROUP. Jeśli użytkownik naciśnie LEFT lub UP, funkcja zwróci poprzednią kontrolkę, chyba że bieżąca kontrolka ma już styl WS_GROUP. Jeśli bieżąca kontrolka ma ten styl, funkcja odwraca kolejność wyszukiwania, lokalizuje pierwszą kontrolkę o stylu WS_GROUP i zwraca kontrolkę, która bezpośrednio poprzedza zlokalizowaną kontrolkę.
Jeśli wyszukiwanie następnej kontrolki w grupie napotka okno ze stylem WS_EX_CONTROLPARENT, system rekursywnie wyszukuje elementy podrzędne okna.
Gdy system ma następną lub poprzednią kontrolkę, wysyła WM_GETDLGCODE komunikat do kontrolki w celu określenia typu kontrolki. Następnie system przenosi fokus danych wejściowych, aby kontrolować, czy nie jest to kontrolka statyczna. Jeśli kontrolka jest automatycznym przyciskiem radiowym, system wysyła do niego komunikat BM_CLICK. Aplikacja może również użyć GetNextDlgGroupItem do lokalizowania kontrolek w grupie.
Ogólnie rzecz biorąc, pierwsza kontrolka w grupie łączy style WS_GROUP i WS_TABSTOP, dzięki czemu użytkownik może przejść z grupy do grupy przy użyciu TAB. Jeśli grupa zawiera przyciski radiowe, aplikacja powinna zastosować styl WS_TABSTOP tylko do pierwszej kontrolki w grupie. System automatycznie przenosi styl, gdy użytkownik przechodzi między kontrolkami w grupie. Dzięki temu fokus danych wejściowych będzie zawsze znajdować się w ostatnio wybranej kontrolce, gdy użytkownik przejdzie do grupy przy użyciu TAB.
Mnemoniki
Mnemonic to zaznaczona litera lub cyfra w etykiecie przycisku lub w tekście kontroli statycznej. System przenosi fokus wejściowy do kontrolki skojarzonej z mnemonikiem, kiedy użytkownik naciska klawisz odpowiadający mnemonikowi lub naciska ten klawisz w połączeniu z klawiszem ALT. Mnemonics umożliwiają użytkownikowi szybkie przejście do określonej kontrolki przy użyciu klawiatury.
Aplikacja tworzy mnemonik dla elementu sterującego, wstawiając znak ampersand (&) bezpośrednio przed wybraną literą lub cyfrą w etykiecie lub tekście elementu sterującego. W większości przypadków ciąg zakończony wartością null dostarczony z kontrolką w szablonie okna dialogowego zawiera znak ampersand. Jednak aplikacja może w dowolnym momencie utworzyć mnemonik, zastępując istniejącą etykietę lub tekst kontrolki przy użyciu funkcji SetDlgItemText. Dla każdego elementu sterującego można określić tylko jeden skrót klawiaturowy. Chociaż jest to zalecane, mnemoniki w oknie dialogowym nie muszą być unikatowe.
Gdy użytkownik naciśnie literę lub cyfrę, system najpierw określi, czy bieżący element sterujący mający fokus wejściowy przetwarza klawisz. System wysyła komunikat WM_GETDLGCODE do kontrolki, a jeśli kontrolka zwraca wartość DLGC_WANTALLKEYS lub DLG_WANTMESSAGE, system przekazuje klucz do kontrolki. W przeciwnym razie wyszukuje kontrolkę, której skojarzenie pasuje do określonej litery bądź cyfry. Wyszukiwanie jest kontynuowane do momentu zlokalizowania kontrolki lub zbadania wszystkich kontrolek. Podczas wyszukiwania pomija wszystkie statyczne kontrolki, które mają styl SS_NOPREFIX.
Jeśli wyszukiwanie kontrolki z pasującym mnemonikiem napotka okno ze stylem WS_EX_CONTROLPARENT, system rekursywnie przeszukuje dzieci tego okna.
Jeśli system lokalizuje kontrolkę statyczną i kontrolka nie jest wyłączona, system przenosi fokus wejściowy do pierwszej kontrolki po kontrolce statycznej, która jest widoczna, nie wyłączona i która ma styl WS_TABSTOP. Jeśli system lokalizuje inny element sterujący, który ma odpowiadający mnemonik, przenosi kursor wejściowy do tego elementu sterującego. Jeśli kontrolka jest domyślnym przyciskiem naciśnięcia, system wysyła BN_CLICKED komunikat do procedury okna dialogowego. Jeśli kontrola jest innym stylem przycisku i w oknie dialogowym nie ma innej kontroli o tym samym mnemoniku, system wysyła komunikat BM_CLICK do kontroli.
Ustawienia okna dialogowego
Ustawienia okna dialogowego to bieżące opcje i wartości kontrolek w oknie dialogowym. Procedura okna dialogowego jest odpowiedzialna za inicjowanie kontrolek zgodnie z tymi ustawieniami podczas tworzenia okna dialogowego. Jest on również odpowiedzialny za pobieranie bieżących ustawień z kontrolek przed zniszczeniem okna dialogowego. Metody używane do inicjowania i pobierania ustawień zależą od typu kontrolki.
Aby uzyskać więcej informacji, zobacz następujące tematy:
- przycisków radiowych i pól wyboru
- Edycja kontrolek w oknie dialogowym
- Listy pól, pola rozwijane i listy katalogów
- Komunikaty sterujące okien dialogowych
Przyciski radiowe i pola wyboru
Okna dialogowe używają przycisków radiowych i pól wyboru, aby umożliwić użytkownikowi wybranie z listy opcji. Przyciski radiowe umożliwiają użytkownikowi wybór spośród wzajemnie wykluczających się opcji; pola wyboru umożliwiają użytkownikowi wybranie kombinacji opcji.
Procedura okna dialogowego może ustawić początkowy stan pola wyboru przy użyciu funkcji CheckDlgButton, która ustawia lub czyści pole wyboru. W przypadku przycisków radiowych w grupie wzajemnie wykluczających się przycisków radiowych procedura okna dialogowego może użyć funkcji CheckRadioButton, aby ustawić odpowiedni przycisk radiowy i automatycznie wyczyścić dowolny inny przycisk radiowy.
Przed zakończeniem okna dialogowego procedura okna dialogowego może sprawdzić stan każdego przycisku radiowego i pole wyboru przy użyciu IsDlgButtonChecked funkcji, która zwraca bieżący stan przycisku. Okno dialogowe zwykle zapisuje te informacje, aby zainicjować przyciski przy następnym utworzeniu okna dialogowego.
Kontrolki edycji okna dialogowego
Wiele okien dialogowych ma kontrolki edycji, które pozwalają użytkownikowi podać tekst jako dane wejściowe. Większość procedur okna dialogowego inicjuje kontrolkę edycji po pierwszym uruchomieniu okna dialogowego. Na przykład procedura okna dialogowego może umieścić proponowaną nazwę pliku w kontrolce, którą użytkownik może wybrać, zmodyfikować lub zamienić. Procedura okna dialogowego umożliwia ustawienie tekstu w kontrolce edycji przy użyciu funkcji SetDlgItemText, która kopiuje tekst z określonego buforu do kontrolki edycji. Gdy kontrolka edycji odbiera fokus wejściowy, automatycznie wybiera pełny tekst do edycji.
Ponieważ kontrolki edycji nie zwracają automatycznie tekstu do okna dialogowego, procedura okna dialogowego musi pobrać tekst przed jego zakończeniem. Tekst można pobrać przy użyciu funkcji GetDlgItemText, która kopiuje tekst kontrolki edycji do buforu. Procedura okna dialogowego zwykle zapisuje ten tekst w celu zainicjowania kontrolki edycji później lub przekazuje ją do okna nadrzędnego na potrzeby przetwarzania.
Niektóre okna dialogowe używają kontrolek edycji, które umożliwiają użytkownikowi wprowadzanie liczb. Procedura okna dialogowego może pobrać liczbę z kontrolki edycji przy użyciu funkcji GetDlgItemInt, która pobiera tekst z kontrolki edycji i konwertuje tekst na wartość dziesiętną. Użytkownik wpisze liczbę w cyfrach dziesiętnych. Może być podpisany lub niepodpisany. Procedura okna dialogowego może wyświetlać liczbę całkowitą przy użyciu funkcji SetDlgItemInt. SetDlgItemInt konwertuje liczbę całkowitą ze znakiem lub bez znaku na ciąg cyfr dziesiętnych.
Pola listy, pola kombi i listy katalogów
Niektóre okna dialogowe zawierają listy nazw, z których użytkownik może wybrać jedną lub więcej nazw. Aby wyświetlić listę nazw plików, na przykład okno dialogowe zazwyczaj używa pola listy i DlgDirList i DlgDirSelectEx funkcji. Funkcja DlgDirList automatycznie wypełnia pole listy nazwami plików w bieżącym katalogu. Funkcja DlgDirSelect pobiera wybraną nazwę pliku z pola listy. Te dwie funkcje zapewniają wygodny sposób wyświetlania listy katalogów, dzięki czemu użytkownik może wybrać plik bez konieczności wpisywania jego nazwy i lokalizacji.
Okno dialogowe może również użyć listy rozwijanej, aby wyświetlić listę nazw plików. Funkcja DlgDirListComboBox automatycznie wypełnia część pola listy w kombinowanym polu nazwami plików w bieżącym katalogu. Funkcja DlgDirSelectComboBoxEx pobiera wybraną nazwę pliku z części pola listy.
Komunikaty sterujące okna dialogowego
Wiele kontrolek rozpoznaje wstępnie zdefiniowane komunikaty, które po odebraniu przez kontrolki powodują wykonanie pewnej akcji. Na przykład komunikat BM_SETCHECK zaznacza pole w polu wyboru, a komunikat EM_GETSEL pobiera część tekstu kontrolki, która jest obecnie zaznaczona. Komunikaty sterujące zapewniają procedurze okna dialogowego większy i bardziej elastyczny dostęp do kontrolek niż standardowe funkcje, dlatego są one często wykorzystywane, gdy okno dialogowe wymaga złożonych interakcji z użytkownikiem.
Procedura okna dialogowego może wysłać komunikat do kontrolki, podając identyfikator kontrolki i używając funkcji SendDlgItemMessage, która jest identyczna z funkcją SendMessage, z tą różnicą, że używa identyfikatora kontrolki zamiast uchwytu okna w celu zidentyfikowania kontrolki, która ma odbierać komunikat. Określony komunikat może wymagać, aby procedura okna dialogowego wysyłała parametry z komunikatem, a komunikat może mieć odpowiednie wartości zwracane. Operacja i wymagania każdego komunikatu sterującego zależą od celu komunikatu i kontrolki, która go przetwarza.
Aby uzyskać więcej informacji na temat komunikatów sterujących, zobacz Kontrolki systemu Windows.
Niestandardowe okna dialogowe
Aplikacja może tworzyć niestandardowe okna dialogowe przy użyciu klasy okien zdefiniowanych przez aplikację dla okien dialogowych zamiast używać wstępnie zdefiniowanej klasy okna dialogowego. Aplikacje zazwyczaj używają tej metody, gdy okno dialogowe jest ich głównym oknem, ale jest również przydatne do tworzenia modalnych i moderacyjnych okien dialogowych dla aplikacji, które mają standardowe nakładające się okna.
Klasa okna zdefiniowanego przez aplikację umożliwia aplikacji zdefiniowanie procedury okna dla okna dialogowego i przetwarzanie komunikatów przed wysłaniem ich do procedury okna dialogowego. Umożliwia również aplikacji definiowanie ikony klasy, pędzla tła klasy i menu klasy dla okna dialogowego. Aplikacja musi zarejestrować klasę okna przed podjęciem próby utworzenia okna dialogowego i musi podać szablon okna dialogowego z wartością atomu lub nazwą klasy okna.
Wiele aplikacji tworzy nową klasę okna dialogowego, najpierw pobierając informacje o klasie dla wstępnie zdefiniowanej klasy okna dialogowego i przekazując ją do funkcji GetClassInfo, która wypełnia strukturę WNDCLASS informacjami. Aplikacja modyfikuje poszczególne elementy członkowskie struktury, takie jak nazwa klasy, szczotka i ikona, a następnie rejestruje nową klasę przy użyciu funkcji RegisterClass. Jeśli aplikacja wypełnia strukturę WNDCLASS samodzielnie, musi ustawić członka cbWndExtra na DLGWINDOWEXTRA, który jest liczbą dodatkowych bajtów wymaganych przez system dla każdej ramki dialogowej. Jeśli aplikacja używa również dodatkowych bajtów dla każdego okna dialogowego, muszą być poza dodatkowymi bajtami wymaganymi przez system.
Procedura niestandardowego okna dialogowego ma te same parametry i wymagania jak każda inna procedura okna. W przeciwieństwie do innych procedur okien, jednak procedura okna dla tego okna dialogowego powinna wywołać funkcję DefDlgProc zamiast funkcji DefWindowProc dla wszystkich komunikatów, które nie są przetwarzane. DefDlgProc wykonuje to samo domyślne przetwarzanie komunikatów co procedura okna dla wstępnie zdefiniowanego okna dialogowego, w tym wywoływanie procedury okna dialogowego.
Aplikacja może również tworzyć niestandardowe okna dialogowe przez podklasę procedury okna wstępnie zdefiniowanego okna dialogowego. Funkcja SetWindowLong umożliwia aplikacji określenie procedury okna dla określonego okna. Aplikacja może również próbować subklasować przy użyciu funkcji SetClassLong, ale ma to wpływ na wszystkie okna dialogowe w systemie, a nie tylko te należące do aplikacji.
Aplikacje tworzące niestandardowe okna dialogowe czasami udostępniają alternatywny interfejs klawiatury dla okien dialogowych. W przypadku niemodalnych okien dialogowych może to oznaczać, że aplikacja nie wywołuje funkcji IsDialogMessage i zamiast tego przetwarza wszystkie dane wejściowe z klawiatury w niestandardowej procedurze okna. W takich przypadkach aplikacja może użyć komunikatu WM_NEXTDLGCTL, aby zminimalizować kod potrzebny do przeniesienia fokusu wejściowego z jednej kontrolki do innej. Ten komunikat, po przekazaniu do DefDlgProc, przenosi fokus wejściowy do określonej kontrolki oraz aktualizuje wygląd kontrolek, takich jak przesunięcie obramowania domyślnego przycisku lub automatyczne ustawienie przycisku radiowego.