Okna dialogowe Message Box

Stronę tą wyświetlono już: 301 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:

Listing 1
  1. HRESULT MessageBox(
  2. HWND hWnd, // uchwyt do okna rodzica
  3. LPCWSTR lpszText, // Text wyświetlany w oknie dialogowym
  4. LPCWSTR lpszTitle, // Text belki tytułowej
  5. 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
  6. )

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:

  • MB_ABORTRETRYIGNORE - wyświetla w oknie trzy przyciski Przerwij, Ponów próbę i Ignoruj;
  • MB_CANCELTRYCONTINUE - wyświetla w oknie trzy przyciski Anuluj, Ponów próbę i Kontynuuj;
  • MB_HELP - dodaje przycisk Pomoc, gdy użytkownik wciśnie ten przycisk lub klawisz F1 to do rodzica okna wysłany zostanie komunikat WM_HELP;
  • MB_OK - wyświetla w oknie tylko i wyłącznie przycisk OK;
  • MB_OKCANCEL - wyświetla w oknie dwa przyciski OK i Anuluj;
  • MB_RETRYCANCEL - wyświetla w oknie dwa przyciski Próbuj ponownie i Anuluj;
  • MB_YESNO - wyświetla w oknie dwa przyciski Tak lub Nie;
  • MB_YESNOCANCEL - wyświetla w oknie przyciski Tak, Nie i Anuluj;

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:

  • MB_ICONEXCLAMATION - wyświetla w okienku ikonkę trójkąta z wykrzyknikiem;
  • MB_ICONWARNING - to samo co MB_ICONEXCLAMATION;
  • MB_ICONINFORMATION - wyświetla ikonkę informacji (niebieski okrąg i literka i w środku);
  • MB_ICONASTERISK - to samo co MB_ICONINFORMATION;
  • MB_ICONQUESTION - ikonka niebieskiego okręgu z znakiem zapytania wewnątrz;
  • MB_ICONSTOP - ikonka czerwonego okręgu z znakiem krzyżyka w środku;
  • MB_ICONERROR - to samo co MB_ICONSTOP;
  • MB_ICONHAND - to samo co MB_ICONSTOP;

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:

  • MB_DEFBUTTON1 - pierwszy wyświetlany przycisk otrzymuje fokus (wartość domyślna);
  • MB_DEFBUTTON2 - drugi wyświetlany przycisk otrzymuje fokus;
  • MB_DEFBUTTON3 - trzeci wyświetlany przycisk otrzymuje fokus;
  • MB_DEFBUTTON4 - czwarty wyświetlany przycisk otrzymuje fokus.

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

  • MB_APPLMODAL - umożliwia operowanie na oknie rodzicu, ale nie pozwala na wykonywanie operacji na jego oknach potomnych;
  • MB_SYSTEMMODAL - to samo co MB_APPLMODAL z tą różnicą, że dodaje jeszcze styl WS_EX_TOPMOST dzięki czemu okno dialogowe wyświetla się zawsze na wierzchu;
  • MB_TASKMODAL - to samo co MB_TASKMODAL z tym wyjątkiem, że wszystkie okna związane z bieżącym procesem zostaną zablokowane na czas pojawienia się okna. Tej flagi należy używać gdy parametr hWnd jest ustawiony na NULL.

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:

  • IDABORT - kliknięto przycisk Przerwij;
  • IDCANCEL - kliknięto przycisk Anuluj;
  • IDCONTINUE - kliknięto przycisk Kontynuuj;
  • IDIGNORE - kliknięto przycisk Ignoruj;
  • IDNO - kliknięto przycisk Nie;
  • IDOK - kliknięto przycisk OK;
  • IDRETRY - kliknięto przycisk Ponów;
  • IDTRYAGAINT - kliknięto przycisk Próbuj ponownie;
  • IDYES - kliknięto przycisk Tak

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:

Listing 2
  1. case ID_PLIK_OTWORZ: // id dla menu a nie akceleratora
  2. {
  3. if(wcslen(FileName)){ // jeżeli jest już jakaś ścieżka do pliku to
  4. 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
  5. SendMessage(hWnd, WM_COMMAND, ID_PLIK_ZAPISZ, 0); // wysyłam komunikat imitujący kliknięcie pozycji w menu zapisz
  6. }
  7. }

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

Listing 3
  1. case ID_PLIK_ZAPISZ: // id dla menu a nie akceleratora
  2. {
  3. 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

Komentarze