Krzysztof Mossakowski
Materiały dla studentów
 

Okna nadrzędne
(klasa CFrameWnd)

MFC
Spis treści

Okna nadrzędne klasa CFrameWnd
Informacje ogólne
Klasa CFrameWnd
Klasa CMDIFrameWnd
Klasa CMDIChildWnd
Klasa CMiniFrameWnd
Hierarchia klas

  •  Informacje ogólne

    • Okna nadrzędne (frame windows) są to okna, których funkcjonalność została rozszerzona o zawieranie innych okien w sobie

    • Klasy obsługi okien nadrzędnych są dziedziczone z klasy CWnd i zawierają pełną funkcjonalność obiektów okien w MFC

      • obiekty okien nadrzędnych w MFC są dołączone do okien Windows, tak jak to miało miejsce w przypadku obiektów klasy CWnd

      • także dla tych obiektów obowiązuje ograniczenie, że jeden obiekt klasy może być dołączony co najwyżej do jednego okna Windows

      • sposób tworzenia, używania i niszczenia obiektów okien nadrzędnych jest niemal taki sam, jak w przypadku obiektów zwykłych okien (CWnd)
        - jedyną różnicą jest zastrzeżenie, żeby obiektów okien nadrzędnych nie niszczyć stosując operator delete, lecz metodę CWnd::DestroyWindow, w obsłudze której znajdzie się wywołanie delete this

    • W oknach nadrzędnych w wyraźny sposób oddzielone są od siebie okno i jego zawartość

      • w aplikacjach typu dokument/widok zawartością takich okien są najczęściej widoki dołączone do swoich dokumentów
        - w takim przypadku okno nadrzędne jest tylko otoczką zawierającą widok
        - daje widokowi obramowanie okna, pasek tytułowy (caption bar) i obsługę standardowego menu okna
        - za zarządzanie obszarem roboczym (client area) okna nadrzędnego odpowiada całkowicie widok

      • najczęściej programista całą obsługę okna nadrzędnego pozostawia systemowi Windows (zmiana pozycji, rozmiaru, zamykanie), natomiast musi się sam zatroszczyć o obsługę zawartości okna

[początek strony]

  •  Klasa CFrameWnd

    • Daje funkcjonalność okna nadrzędnego dla aplikacji SDI (Single Document Interface) 

      • w takim rodzaju aplikacji zawsze jest tylko jedno okno nadrzędne (jeden obiekt klasy CFrameWnd lub potomnych)

    • Każda klasa bezpośrednio dziedzicząca z CFrameWnd musi być zadeklarowana z użyciem makra DECLARE_DYNCREATE, co umożliwia dynamiczne tworzenie obiektów podczas wykonywania programu

    • Istnieją trzy sposoby tworzenia okien nadrzędnych klasy CFrameWnd

      • - utworzyć obiekt klasy
        - ewentualnie zarejestrować specjalną klasę dla okna przy pomocy funkcji AfxRegisterWndClass
        - utworzyć okno w systemie Windows przy pomocy metody CWnd::Create albo CWnd::CreateEx

      • - utworzyć obiekt klasy
        - wywołać metodę CFrameWnd::LoadFrame, stworzy okno w Windows i dołączy do niego wczytane zasoby (menu, tablicę akceleratorów, ikonę, tytuł okna)

      • trzecim sposobem, który, w przeciwieństwie do dwóch pierwszych, jest sposobem pośrednim, jest zdefiniowanie wzorca dokumentu
        - daje to możliwość automatycznego tworzenia okna nadrzędnego na początku pracy aplikacji (w aplikacji SDI istnieje zawsze jedno i tylko jedno okno nadrzędne)
        - na podstawie wzorca dokumentu tworzone są dokumenty i ich widoki

    • Dodatkowa funkcjonalność klasy CFrameWnd (w porównaniu z klasą CWnd)

      • zapamiętywanie aktywnego widoku

      • przekierowanie komunikatów (messages) i poleceń (commands) do aktywnego widoku

      • obsługa ustawienia wszystkich okien potomnych (widoków i control bars)

      • uaktualnienie stanu kontrolek na control bars

      • uaktualnienie stanu pozycji menu przed jego rozwinięciem

      • obsługa akceleratorów

      • obsługa mechanizmu drag & drop plików

      • jeśli jest to główne okno aplikacji (CWinApp::m_pMainWnd), użytkownik zostanie ostrzeżony przy próbie zamykania niezapisanego dokumentu 

[początek strony]

  •  Klasa CMDIFrameWnd

    • Daje funkcjonalność głównego okna nadrzędnego (main frame window) dla całej aplikacji MDI (Multi Document Interface)

    • Klasy dziedziczące z CMDIFrameWnd nie muszą być deklarowane z użyciem makra DECLARE_DYNCREATE (mimo że dziedziczą pośrednio z CFrameWnd, gdzie taki wymóg istnieje)

    • Tworzenie okna nadrzędnego klasy CMDIFrameWnd

      • utworzyć obiekt, ewentualnie zarejestrować nową klasę okna, wywołać metodę CMDIFrameWnd::Create albo CMDIFrameWnd::LoadFrame

      • nadrzędne okno aplikacji ma nie żadnego powiązania z dokumentami, dlatego nie może być tworzone w pośredni sposób przy pomocy wzorca dokumentu

    • Dodatkowa funkcjonalność klasy CMDIFrameWnd (w porównaniu z klasą CFrameWnd)

      • pełna obsługa okna MDICLIENT
        - ta obsługa jest niewidoczna dla programisty, nawet style WS_HSCROLL i WS_VSCROLL są podawane podczas tworzenia okna CMDIFrameWnd, chociaż będą obowiązywały dla okna MDICLIENT
        - okno MDICLIENT jest oknem potomnym okna CMDIFrameWnd
        - wszystkie widoki dokumentów są oknami potomnymi okna MDICLIENT

      • standardowa obsługa ułożenia okien roboczych w aplikacji MDI (dzielony, kaskadowy, rozmieszczenie ikon)

      • dwa rodzaje menu
        - gdy nie ma żadnego widoku dokumentu ustawiane jest domyślne menu okna nadrzędnego
        - gdy jest widok ustawiane jest menu tego widoku

[początek strony]

  •  Klasa CMDIChildWnd

    • Daje funkcjonalność okna nadrzędnego dla widoków dokumentu w aplikacji MDI (Multi Document Interface) 

    • Są takie same sposoby tworzenia okien klasy CMDIChildWnd jak obiektów klasy CFrameWnd

      • najczęściej wykorzystywany jest pośredni sposób tworzenia z użyciem wzorca dokumentu

    • Dodatkowa funkcjonalność klasy CMDIChildWnd (w porównaniu z klasą CFrameWnd)

      • przy stosowaniu wzorców dokumentów dla aplikacji MDI (czyli klasy CMultiDocTemplate) wiele obiektów klasy CMDIChildWnd dzieli to samo menu, co daje oszczędność zasobów Windows

      • menu aktywnego okna potomnego (widoku) zamienia menu głównego okna nadrzędnego aplikacji

      • aktywne okno potomne (widok) zmienia tytuł głównego okna nadrzędnego aplikacji

[początek strony]

  •  Klasa CMiniFrameWnd

    • Daje funkcjonalność okna nadrzędnego dla okien o zmniejszonej wysokości paska tytułowego (caption bar)

    • Zwykle są stosowane dla toolbars, gdy mają się pojawić w oddzielnym okienku (niezadokowane, czyli nieprzyklejone do okna nadrzędnego)

    • Nie mają przycisków minimalizacji i maksymalizacji okna oraz menu okna

    • Sposób tworzenie:

      • utworzyć obiekt i wywołac CMiniFrameWnd::Create

[początek strony]

  •  Hierarchia klas

    CObject - informacja w trakcie wykonywania, dynamiczne tworzenie, serializacja
        CCmdTarget - obsługa komunikatów Windows
            CWnd - obsługa okna Windows
                CFrameWnd
                    CMDIFrameWnd
                    CMDIChildWnd
                    CMiniFrameWnd

[początek strony]