Krzysztof Mossakowski
Materiały dla studentów
 

Okna dialogowe
(klasa CDialog)

MFC
Spis treści

Okna dialogowe
klasa CDialog
Informacje ogólne
Najczęstszy sposób wykorzystania
Okna dialogowe modalne i niemodalne
Obsługa  kontrolek okna dialogowego
Możliwości okien dialogowych
Okna dialogowe z zakładkami
Standardowe okna dialogowe Windows
Hierarchia klas

  •  Informacje ogólne

    • Okna dialogowe są specyficznym rodzajem okien w systemie Windows, mają one na celu uzyskanie od użytkownika pewnych informacji

      • zwykle informacje są wprowadzane przy pomocy kontrolek umieszczonych na oknie dialogowym

    • Istnieją dwa typy okien dialogowych:

      • modalne (modal), które muszą być zamknięte przez użytkownika przed dalszą pracą z aplikacją, zazwyczaj zamknięcie okna dialogowego następuje po naciśnieciu przycisku OK albo Cancel

      • niemodalne (modeless), które nie przeszkadzają w normalnej pracy z aplikacją

    • Okno dialogowe w MFC tworzą dwa składniki:

      • zasób wzorca okna dialogowego (dialog-template resource)
        - określa rozmiar, położenie okna dialogowego oraz typy, rozmiary i położenia kontrolek umieszczonych na oknie dialogowym
        - w prosty sposób może być tworzony z edytorze zasobów (resource editor)
        - możliwe jest także tworzenie dialogu na podstawie wzorca stworzonego w pamięci, jest to dużo bardziej kłopotliwe i w większości przypadków niepotrzebne

      • obiekt klasy CDialog lub potomnej

    • Klasa CDialog daje pełną funkcjonalność okien dialogowych

[początek strony]

  •  Najczęstszy sposób wykorzystania

    • Schemat najprostszego tworzenia okna dialogowego:

      • przy pomocy edytora zasobów utworzyć wzorzec dialogu
        - określić rozmiary dialogu
        - umieścić pożądane kontrolki

      • utworzyć klasę dziedzicząca z CDialog, która będzie się zajmować tylko tym dialogiem
        - najprościej jest użyć do tego ClassWizard

      • dodać obsługę zawartości kontrolek okna dialogowego
        - także najprościej jest wykorzystać funkcje ClassWizard

[początek strony]

  •  Okna dialogowe modalne i niemodalne

    • Sposób użycia okien dialogowych modalnych:

      • utworzyć obiekt klasy tego okna dialogowego (dziedziczącej z CDialog)

      • wywołać metodę CDialog::DoModal
        - zostanie utworzone okno dialogowe jako okno w systemie Windows (identyfikowane, tak jak pozostałe okna, przez swój uchwyt - HWND)
        - utworzone okno dialogowe zostanie wyświetlone
        - użytkownik będzie mógł dowolnie manipulować zawartością kontrolek okna dialogowego
        - użytkownik zamknie okno dialogowe przy pomocy jednego z przycisków zamykających (zwykle OK albo Cancel), wywołana metoda CDialog::DoModal zwróci kod wyjścia odpowiadającą użytemu przyciskowi

      • zakończyć działanie okna dialogowego z kodu programu można wywołując metodę CDialog::EndDialog z podaniem parametru, którego wartość zostanie przez CDialog::DoModal zwrócona jako kod wyjścia

    • Sposób użycia okien dialogowych niemodalnych:

      • utworzyć okiekt klasy tego okna dialogowego (tak jak w przypadku okien dialogowych modalnych)

      • wywołać metodę CDialog::Create, która utworzy okno w systemi Windows
        - jeśli dla tworzonego okna został podany styl WS_VISIBLE okno automatycznie pojawi się na ekranie
        - jeśli nie, żeby pokazać okno trzeba wywołać metodę CDialog::ShowWindow (metoda z klasy CWnd)

      • żeby zniszczyć okno dialogowe należy, tak samo jak dla innych okien, wywołać CDialog::DestroyWindow

[początek strony]

  •  Obsługa kontrolek okna dialogowego

    • Dostęp do każdej kontrolki umieszczonej na oknie dialogowym jest możliwy dzięki metodzie CDialog::GetDlgItem

      • jest to metoda odziedziczona z CWnd, ale dopiero w przypadku okien dialogowych widać jej funkcjonalność

      • metoda ta zwraca wskaźnik do obiektu CWnd reprezentującego kontrolkę, co umożliwia dokonanie wszystkich czynności, od schowania lub pokazania kontrolki aż do zmiany jej zawartości

    • Klasa CDialog daje także inny sposób dostępu do kontrolek i ich zawartości poprzez definiowanie zmiennych klasy obsługującej dialog (dziedziczącej z CDialog)

      • wymiana danych pomiędzy zmiennymi klasy i kontrolkami okna dialogowego (w obie strony) dokonuje się za pośrednictwem metody CDialog::UpdateData
        - żeby uaktualnić zmienne na podstawie kontrolek należy wywołać tę funkcję z parametrem TRUE
        - żeby zmienić zawartość kontrolek na podstawie wartości zmiennych należy jako parametr przekazać FALSE

      • za samą wymianę danych pomiędzy zmiennymi i kontrolkami jest odpowiedzialna metoda CDialog::DoDataExchange, którą najczęściej całkowicie zarządza ClassWizard
        - funkcje DDX_... (np. DDX_Text) umożliwiają wymianę danych
        - funkcje DDV_... (np. DDV_MaxChars) umożliwiają sprawdzanie poprawności zawartości kontrolek
        - możliwe jest tworzenie własnych funkcji wymiany danych lub sprawdzania poprawności
        - wszystkie wpisy w nawiasach {{AFX_DATA_MAP, }}AFX_DATA_MAP powinny być modyfikowane tylko za pośrednictwem ClassWizard

      • używane są dwa typy zmiennych: określające całe kontrolki albo określajace zawartość kontrolek, możliwe jest jednoczesne używanie wielu zmiennych dołączonych do jednej kontrolki

    • Obsługa przycisków na oknie dialogowym

      • po naciśnięciu przez użytkownika przycisku wysyłany jest komunikat BN_CLICKED

      • tak jak w przypadku pozostałych komunikatów Windows dla jego obsłużenia w MFC musi być zdefiniowana funkcja
        - funkcja ta powinna być zadeklarowana przy pomocy makra ON_BN_CLICKED i powinna być afx_msg

      • najprościej jest używać ClassWizard do tworzenia takich funkcji (zostanie automatycznie dodana deklaracja w pliku .H, w deklaracjach funkcji obsługi komunikatów oraz zostanie automatycznie utworzona taka funkcja z pustą zawartością)

      • standardowe przyciski OK i Cancel mają wbudowana wirtualne metody obsługi, odpowiednio CDialog::OnOK i CDialog::OnCancel
        - standardowe implementacje tych metod wywołują CDialog::EndDialog z parametrami odpowiednio IDOK i IDCANCEL
        - nadpisując te funkcje można nie pozwolić na zamknięcie okna dialogowego

[początek strony]

  •  Możliwości okien dialogowych

    • Przy pomocy metody CWinApp::SetDialogBkColor wywoływanej zwykle w CWinApp::InitInstance można zmienić tło wszystkich dialogów w aplikacji

    • Inicjalizacji okna dialogowego należy dokonywać zawsze w nadpisanej wirtualnej metodzie CDialog::OnInitDialog

      • w tej metodzie wszystkie kontrolki okna dialogowego są już utworzone i możliwe jest np. ustawianie ich zawartości na podstawie pewnych danych inicjujących

    • Możliwe jest ustawienie identyfikatora pomocy dla dialogu przy pomocy CDialog::SetHelpID

[początek strony]

  •  Okna dialogowe z zakładkami

    • Zakładki na oknie dialogowym to mechanizm pozwalający na zawarcie na jednym oknie dialogowym wielu stron zawierających kontrolki

    • Okno dialogowe z zakładkami (tab dialog) zwane jest także arkuszem własności (property sheet) i składa się ze stron własności (property page)

    • Podstawową klasą takiego okna jest CPropertySheet

      • funkcjonalnie bardzo podobna do CDialog, choć nie jest to jej klasa pochodna

      • mogą być modalne (przez uzycie metody CPropertySheet::DoModal) lub niemodalne (CPropertySheet::Create)

    • Klasa CPropertySheetEx rozszerza możliwości klasy CPropertySheet o pokazywanie obrazka w tle okna dialogowego, jest dostępna tylko w Windows 98 i NT 5.0

    • Podstawową klasą jednej strony okna dialogowego z zakładkami jest CPropertyPage

      • dziedziczy z CDialog

      • ma zasób wzorca okna dialogowego, który można edytować przy pomocy edytora zasobów

      • kontrolki są trzymane tylko na poszczególnych stronach, nie zaś na samym oknie dialogowym

    • Klasa CPropertyPageEx rozszerza możliwości klasy CPropertyPage o defniowanie podtytuły strony, jest dostępna tylko w Windows 98 i NT 5.0

    • Schemat użycia okna dialogowego z zakładkami

      • dla każdej strony utworzyć oddzielny wzorzec w zasobach
        - nie muszą być takich samych rozmiarów, mniejsze zostaną powiększone do rozmiaru największego
        - musi być określone jako okno potomne (child), z cienkim obramowaniem (thin border), zaznaczony pasek tytułowy (titlebar) oraz zaznaczona opcja niedostępności (disabled)

      • dla każdej strony utworzyć klasę dziedziczącą z CPropertyPage

      • do tych klas dodać zmienne związane z kontrolkami i ich zawartościami

      • utworzyć obiekt klasy CPropertySheet

      • dla każdej strony utworzyć obiekt jej klasy i przy pomocy metody CPropertySheet::AddPage dodać do okna dialogowego

      • żeby otrzymać okno dialogowe modalne wywołać CPropertySheet::DoModal, niemodalne - CPropertySheet::Create

[początek strony]

  •  Standardowe okna dialogowe Windows

    • W systemie Windows istnieją następujące standardowe okna dialogowe, których można zawsze używać

      • wybór koloru - obsługiwany w MFC za pośrednictwem klasy CColorDialog

      • wybór fontu - CFontDialog

      • drukowanie - CPrintDialog

      • wybór pliku do odczytu/zapisu - CFileDialog

      • szukanie/zamiana tekstu - CFindReplaceDialog

    • Wszystkie klasy obsługi standardowych okien dialogowych dziedziczą z CCommonDialog

    • Są zawarte w pliku COMMDLG.DLL

[początek strony]

  •  Hierarchia klas

    CObject - informacja w trakcie wykonywania, dynamiczne tworzenie, serializacja
        CCmdTarget - obsługa komunikatów Windows
            CWnd - okno
                CDialog
                    CCommonDialog
                        CColorDialog
                        CFontDialog
                        CPrintDialog
                        CFileDialog
                        CFindReplaceDialog
                        CPropertyPage
                        CPropertyPageEx
                   CPropertySheet
                    CPropertySheetEx

[początek strony]