Aplikacja
klasa CWinApp
|
|
-
-
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]
-
-
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]
-
-
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
[początek strony]
-
-
Rejestracja plików w shell
systemu Windows
-
Obsługa mechanizmu
przenoszenia plików drag & drop
-
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]
[początek strony]
-
-
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]
[początek strony]
|