Krzysztof Mossakowski
Materiały dla studentów
 

Aplikacja
(klasa CWinApp)

MFC
Spis treści

Aplikacja
klasa CWinApp
Informacje ogólne
Najczęstszy sposób wykorzystania
Metody wirtualne klasy CWinApp 
Dodatkowe możliwości klasy CWinApp
Dostęp do głównych obiektów aplikacji
Wykonywanie czynności w tle
Hierarchia klas

  •  Informacje ogólne

    • Aplikacja w ogólnym pojęciu jest synonimem programu w systemie Windows

    • Za pełną funkcjonalność aplikacji systemu Windows w MFC odpowiada klasa CWinApp

    • ClassWizard automatycznie generuje klasę pochodną klasy CWinApp i jej deklarację i definicję umieszcza w specjalnie utworzonych plikach .H i .CPP

    • W MFC istnieje klasa CWinApp, której obiekt (zawsze tylko jeden) istnieje zawsze podczas działania programu

      • jest automatycznie tworzony i niszczony

      • jest obiektem globalnym

      • ClassWizard nadaje temu obiektowi nazwe theApp i jego definicję dołącza w pliku, w którym znajduje się definicja klasy aplikacji

[początek strony]

  •  Najczęstszy sposób wykorzystania

    • Zawsze w programie tworzonym przy pomocy MFC jest dokładnie jeden obiekt klasy aplikacji programu, dziedziczącej z CWinApp

      • ClassWizard dodaje deklarację tego obiektu do pliku .CPP zawierające klasę aplikacji programu

      • standardową nazwą tego obiektu, zawsze stosowaną przez ClassWizard, jest theApp

      • jest to obiekt globalny, automatycznie tworzony i niszczony

      • wskaźnik do tego obiektu można uzyskać przy pomocy funkcji AfxGetApp

      • prostszą metodą uzyskania dostępu do tego obiektu jest dodanie w pliku .H zawierającym deklarację klasy aplikacji deklaracji obiektu jako extern - ponieważ ten plik .H jest głównym plikiem nagłówkowym i zwykle będzie musiał być dołączony dyrektywą #include do wszystkich plików .CPP, to w ten sposób z każdego miejsca kodu programu będzie dostęp do obiektu aplikacji

    • Sposobem na rozszerzenie funkcjonalności aplikacji jest nadpisywanie wirtualnych metod klasy CWinApp we własnej klasie aplikacji

[początek strony]

  •  Metody wirtualne klasy CWinApp

    • CWinApp::InitInstance

      • wywoływana na początku pracy aplikacji

      • za zadanie ma dokonanie pełnej inicjalizacji aplikacji

      • standardowa implementacja tej metody dla klasy dziedziczącej z CWinApp, automatycznie generowana przez ClassWizard wykonuje następujące czynności:
        - wczytuje ostatnie ustawienia aplikacji z pliku .INI lub z rejestrów
        - jeśli jest to aplikacja o architekturze dokument/widok tworzy wzorzy wzorzec dokumentu i rejestruje go
        - w aplikacji MDI (Multi Document Interface) tworzy okno nadrzędne aplikacji
        - obsługuje parametry wywołania programu, np. nazwę dokumentu, który powinien zostać automatycznie otworzony
        - pokazuje główne okno aplikacji (zawsze pamiętane w zmiennej CWinApp::m_pMainWnd)

      • jeśli zwróci wartość FALSE aplikacja zostanie zakończona (można to wykorzystać np. tworząc aplikacje, których tylko jedna instancja może być uruchomiona w danej chwili - sprawdzić czy jest już jakaś instancja, jeśli jest to zwrócić FALSE)

    • CWinApp::Run

      • wywoływana po inicjalizacji

      • obsługuje pętlę komunikatów

      • jeśli nie ma żadnego komunikatu do obsłużenia wywołuje CWinApp::OnIdle

      • jeśli aplikacja powinna zakończyć pracę wywołuje CWinApp::ExitInstance

    • CWinApp::ExitInstance

      • wywoływana przed zakończeniem aplikacji

      • powinna być wywoływana tylko z CWinApp::Run

      • standardowa implementacja zawiera zapis ustawień aplikacji do pliku .INI lub rejestrów

      • jest miejscem, gdzie powinna być wykonywane dodatkowe czynności porządkujące przed zakończeniem pracy aplikacji

    • CWinApp::OnIdle

      • wywoływana z CWinApp::Run gdy nie ma żadnego komunikatu do obsłużenia

[początek strony]

  •  Dodatkowe możliwości klasy CWinApp

    • Rejestracja plików w shell systemu Windows

      • osiągana przez wywołanie w CWinApp::InitInstance metod CWinApp::RegisterShellFileTypes i CWinApp::EnableShellOpen

    • Obsługa mechanizmu przenoszenia plików drag & drop

      • osiągana przez wywołanie metody CWin::DragAcceptFiles dla głównego okna aplikacji (CWinApp::m_pMainWnd)

    • Obsługa listy ostatnio używanych plików (MRU - most recently used)

      • CWinApp::LoadStdProfileSettings dla wczytania listy MRU

      • CWinApp::AddToRecentFileList dla ręcznej modyfikacji listy

      • lista MRU jest automatycznie uaktualniana po każdym wczytaniu dokumentu

    • CWinApp jest klasą dziedziczącą z CCmdTarget co daje wbudowane mechanizmy obsługi komunikatów

    • CWinApp jest klasą dziedziczącą z CWinThread, co oznacza, że jest jednoczęsnie wątkiem w Windows

      • w większości zastosowań jeden wątek dla aplikacji jest wystarczający i wtedy theApp jest jedynym obiektem z klasy CWinThread (pośrednio) w całej aplikacji

      • w przypadku aplikacji wykorzystującej wielowatkowość Windows takich obiektów będzie więcej

[początek strony]

  •  Dostęp do głównych obiektów aplikacji

    • Funkcje dające dostęp do głównych obiektów aplikacji:

      • AfxGetApp - obiekt aplikacji

      • AfxGetInstanceHandle - uchwyt do instancji aplikacji

      • AfxGetResourceHandle - uchwyt do zasobów aplikacji

      • AfxGetAppName - nazwa aplikacji

      • AfxGetMainWnd - główne okno aplikacji

[początek strony]

  •  Wykonywanie czynności w tle

    • Jednym sposobem na wykonywanie czynności w tle pracy aplikacji jest utworzenie oddzielnego wątku - aplikacja stanie się wtedy wielowątkowa

    • Drugim sposobem jest nadpisanie CWinApp::OnIdle, rozwiązanie teoretycznie najbardziej eleganckie, w praktyce może okazać się niewystarczające - czas, który aplikacja może poświęcić na wywoływanie tej metody jest stosunkowo niewielki

    • Trzecim sposobem jest obsługiwanie komunikatów Windows podczas wykonywania obliczeń, przykładowy kod:

      while  ( bDoingBackgroundProcessing )  {
          MSG msg;
          while  ( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ))  {
              if  ( !PumpMessage())  {
                  bDoingBackgroundProcessing = FALSE; 
                  ::PostQuitMessage(); 
                  break; 
              }
          }
          // let MFC do its idle processing
          LONG lIdle = 0;
          while ( AfxGetApp()->OnIdle(lIdle++ ) )
              ;  
          // Perform some background processing here 
          // using another call to OnIdle
      }
       

[początek strony]

  •  Hierarchia klas

    CObject - informacja w trakcie wykonywania, dynamiczne tworzenie, serializacja
        CCmdTarget - obsługa komunikatów Windows
            CWinThread - obsługa wątku Windows
                CWinApp

[początek strony]