Krzysztof Mossakowski
Materiały dla studentów
 

Okna
(klasa CWnd)

MFC
Spis treści

Okna
klasa CWnd
Informacje ogólne
Tworzenie okna
Używanie okna
Niszczenie okna
Hierarchia klas

  •  Informacje ogólne

    • Okno w systemie Windows jest podstawowym obiektem umożliwiającym obsługę komunikatów, na których cały system się opiera

      • obiektami Windows, które reprezentują okna są uchwyty (HWND), każde okno ma swój unikalny uchwyt, na podstawie którego jest rozróżniane od pozostałych okien

    • Pełną funkcjonalność okien w MFC daje klasa CWnd

      • zawiera większość funkcji API umożliwiających operacje na oknie

      • zawiera w sobie uchwyt okna (CWnd::m_hWnd)

    • Obiekt klasy CWnd może być (ale nie musi) dołączony tylko do jednego okna Windows (czyli do jednego uchwytu HWND)

      • mogą istnieć obiekty CWnd bez odpowiadających im okien w systemie Window

      • mogą istnieć w Windows okna tworzone przez aplikacje napisane przy użyciu MFC, które nie mają odpowiadających im obiektów klasy CWnd

[początek strony]

  •  Tworzenie okna

    • Schemat tworzenia okna:

      • zarejestrowanie klasy okna
        - większość klas jest automatycznie rejestrowana w aplikacjach MFC i programista nie musi nawet pamiętać, że coś takiego istnieje
        - istnieje możliwość tworzenia własnych klas przy pomocy funkcji AfxRegisterWndClass

      • stworzenie obiektu klasy CWnd - może być tworzony statycznie lub dynamicznie

      • stworzenie okna w systemie Windows przy pomocy funkcji CWnd::Create lub CWnd::CreateEx
        - przed stworzeniem okna zostanie wywołana wirtualna metoda CWnd::PreCreateWindow, nadpisując ją można zmienić parametry okna ustawiane przy jego tworzeniu

    • Istotny jest fakt, że stworzenie obiektu klasy CWnd nie oznacza automatycznego utworzenia okna w Windows

      • daje to możliwość dołączenia obiektu do już istniejącego okna Windows (CWnd::Attach) i odłączenie (CWnd::Detach)

[początek strony]

  •  Używanie okna

    • Rysowanie

      • w MFC wykorzystano schemat rysowania zastosowany w Windows - zawsze rysowanie odbywa się na kontekście urządzenia (DC - device context)

      • do pobierania kontekstu do rysowania służą metody:
        - CWnd::GetDC - dla kontekstu obszaru roboczego (client area)
        - CWnd::GetWindowDC - dla kontekstu całego okna

      • po narysowaniu używany kontekst należy zwolnić przy pomocy funkcji CWnd::ReleaseDC

      • można zmieniać części obszaru roboczego, które przy najbliższym rysowaniu zostaną uaktualnione: CWnd::Invalidate, CWnd::InvalidateRect, CWnd::InvalidateRgn, CWnd::ValidateRect, CWnd::ValidateRgn

    • Obsługa komunikatów

      • w klasie CWnd istnieją wirtualne metody obsługujące poszczególne komunikaty Windows
        - są deklarowane jako afx_msg i mają przedrostek On (np. CWnd::OnPaint)

    • Sposoby zmiany parametrów okna

      • utworzenie różnej od standardowej klasy okna przy pomocy funkcji AfxRegisterWndClass

      • zmiana parametrów tworzenia okna w nadpisanej wirtualnej metodzie CWnd::PreCreateWindow

    • Inicjalizacja okna Windows w obiekcie klasy CWnd

      • nie można inicjować okna przed jego utworzeniem, z tego powodu najlepszym miejscem na inicjalizację jest nadpisana metoda wirtualna CWnd::OnCreate

    • W klasie CWnd zawarta jest większość funkcji API dokonujących operacji na oknach, w większości przypadków są to tylko funkcje przejściowe, które pobierają uchwyt okna (CWnd::m_hWnd) i dla niego wywołują funkcję API

      • są to funkcje inline i nie powodują narzutów czasowych podczas wykonywania pracy programu

      • ich użyciu jest zalecane dla zwiększenia czytelności kodu (zastosowanie cech programowania obiektowego)

[początek strony]

  •  Niszczenie okna

    • Czynności wykonywane gdy użytkownik zamyka okno:

      • wywoływana jest wirtualna metoda CWnd::OnClose

      • standardowa CWnd::OnClose wywołuje CWnd::DestroyWindow

      • ostatnią wywoływana metodą obiektu okna jest wirtualna CWnd::OnNcDestroy

      • standardowa CWnd::OnNcDestroy wywołuje CWnd::PostNcDestroy

      • CWnd::PostNcDestroy dla obiektu pochodzącego z klasy CFrameWnd (także pośrednio) wywołuje delete this

    • Zasadą w MFC jest nieużywanie operatora delete dla okien nadrzędnych (z klasy CFrameWnd i potomnych) oraz dla widoków

      • dla tych okien w celu ich zniszczenia zawsze należy wywoływać CWnd::DestroyWindow, w ostatnią czynnością niszczenia będzie wywołanie delete this

      • okna nadrzędne powinny być umieszczane na stercie (tworzone dynamicznie), natomiast w przypadku pozostałych okien zalecane jest ich tworzenie na stosie (statyczne)

    • Można zniszczyć obiekt CWnd nie niszcząc okna, przed rozpoczęciem należy przy pomocy metody CWnd::Detach odłączyć obiekt klasy CWnd od rzeczywistego okna (uchwytu HWND) systemu Windows

[początek strony]

  •  Hierarchia klas

    CObject - informacja w trakcie wykonywania, dynamiczne tworzenie, serializacja
        CCmdTarget - obsługa komunikatów Windows
            CWnd
                CFrameWnd - okno nadrzędne aplikacji
                CView - widok dokumentu w aplikacji typu dokument/widok
                CSplitterWnd - okno umożliwiające dzielenie okna pomiędzy widokami
                CControlBar - pomocnicze okno głównego okna zawierające kontrolki
                CPropertySheet - okno z zakładkami
                CDialog - okno dialogowe
                kontrolki systemu Windows

[początek strony]