Okna dialogowe Message Box

Autor podstrony: Krzysztof Zajączkowski

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

Funkcja MessageBox

Okno dialogowe typu Message Box (okno wiadomości) to jedno z najczęściej wykorzystywanych okien w programach okienkowych wszelakiej maści. Wywołaniem takiego okna dialogowego zajmuje się funkcja, którą już wcześniej wielokrotnie wykorzystywałem we wcześniejszych projektach, czyli MessageBox, spójrzmy łaskawym okiem co ta funkcja zwraca (tak, bo ona coś zwraca) i co przyjmuje jako parametry:

HRESULT MessageBox( HWND hWnd, // uchwyt do okna rodzica LPCWSTR lpszText, // Text wyświetlany w oknie dialogowym LPCWSTR lpszTitle, // Text belki tytułowej UINT fuStyle, // Flagi określające: jakie przyciski okno będzie zawierało (a tym samym jaką wartość może zwrócić funkcja MessageBox po zamknięciu okna dialogowego) oraz możliwość określenia ikonki wyświetlanej przy tekście )

Parametr fuStyle

Pierwsze trzy parametry zostały dość dokładnie omówione w komentarzu nagłówka funkcji, natomiast ostatni parametr jest dużo bardziej ciekawy, ponieważ zawiera on flagi sterujące zawartością okna dialogowego. Oto przykład wartości tego parametru, które mogą zostać użyte w celu wyświetlenia różnej kombinacji przycisków standardowych w oknie wiadomości:

Poza powyżej wymienionymi flagami można jeszcze do okienka dodać jedną z standardowych ikonek systemowych, które często są widoczne np. przy wyświetlaniu komunikatów błędów jest znak trójkątny z wykrzyknikiem. Dostępne są następujące typy ikonek:

Istnieje też możliwość ustawienia, który z przycisków na starcie będzie miał fokus - czuli będzie przetwarzał komunikaty z klawiatury. Jest to ważne, ponieważ często ułatwia to użytkownikowi wybranie najczęściej wykorzystywanej opcji np. OK poprzez zwykłe kliknięcie spacji czy też entera. Oto dostępne flagi:

Określenie zachowanie okna dialogowego względem innych okien (modalność):

Zwracana wartość

Jak już wcześniej wspominałem funkcja MessageBox coś zwraca, to coś to identyfikator klikniętego przycisku, który może przyjmować jedną z poniższych wartości:

Zastosowanie funkcji MessageBox w projekcie myNotepad

Co prawda w programie myNotepad już była używana funkcja MessageBox, lecz tym razem zastosowana zostanie ona do zapytania użytkownika, czy zapisać bieżący dokument do pliku. W kodzie programu myNotepad w komunikacie WM_COMMAND dla identyfikatora pozycji menu ID_PLIK_OTWOZ należy dodać podmienić odpowiednio taki oto kod:

case ID_PLIK_OTWORZ: // id dla menu a nie akceleratora { if(wcslen(FileName)){ // jeżeli jest już jakaś ścieżka do pliku to if(IDYES == MessageBox(hWnd, L"Czy zapisać bieżący dokument?",L"Zapytanie",MB_YESNO|MB_ICONQUESTION)){// wyświetl okno wiadomości z zapytaniem, czy zapisać bierzący dokument SendMessage(hWnd, WM_COMMAND, ID_PLIK_ZAPISZ, 0); // wysyłam komunikat imitujący kliknięcie pozycji w menu zapisz } }

W tym samym komunikacie WM_COMMAND należy podmienić kod związany z ID_PLIK_ZAPISZ dla menu:

case ID_PLIK_ZAPISZ: // id dla menu a nie akceleratora { if(wcslen(FileName) || GetSaveFileName(&ofn)){ // jeżeli ścieżka do pliku już istnieje lub wyświetlenie okna zapisu się powiedzie i użytkownik wybierze plik do zapisu to