Клас CWinApp

Функція WinMain() та клас CWinApp

При створенні проекту за допомогою “майстра” проектів, функція WinMain() явно не створюється. Вона захована в типовий об’єктний код заготовки програми. Такий підхід звільняє розробника від написання багатьох рядків рутинного додаткового коду для виконання стандартних кроків ініціалізації програми. Основні моменти в реалізації цієї функції розглядалися в попередніх лекціях. Тут слід зауважити, що у файлі реалізації основного класу програми CWinApp, створюється єдиний глобальний об’єкт цього класу з фіксованим іменем theApp, який і служить точкою входу в програму, а оболонка використовує це наперед визначене ім’я для запуску програми. В бібліотеці реалізовано функція, яка повертає вказівник на цей глобальний об’єкт.

 

CWinApp* pApp = AfxGetApp();

 

Клас CWinApp є базовим класом від якого утворюється обов’язковий об’єкт-програма для Windows на основі MFC, його ієрархія показана на рис. __.

 

 

Рис. __. Ієрархія класу CWinApp

 

Основними задачами цього класу є:

- ініціалізація основного вікна програми;

- створення та опитування черги повідомлень;

- ініціалізація основних змінних, відновлення та збереження налаштувань і оточення програми.

Розглянемо основні змінні- та функції-члени класу CWinApp.

Змінні-члени класу:

LPSTR m_pszAppName – назва програми (загальнодоступна).

HINSTANCE m_hInstance – копія логічного номеру (дескриптора) програми (загальнодоступна).

LPSTR m_lpCmdLine – копія вказівника на командний рядок програми (загальнодоступна).

int m_nCmdShow – копія параметру, що визначає первинне відображення вікна програми на екрані (загальнодоступна).

LPSTR m_pszExeName – назва завантажувального модуля програми без розширення (загальнодоступна).

LPSTR m_pszProfileName – назва INI-файлу програми (загальнодоступна).

LPCSTR m_pszRegistryKey – визначає повний ключ реєстру, де зберігається профіль налаштувань програми (загальнодоступна).

Додатково клас CWinApp на слідує від класу CWinThread змінну m_pMainWnd типу CWnd, яка зберігає вказівник на об’єкт основного вікна біжучого потоку. Windows автоматично завершує програму, якщо закривається основне вікно.

Функції ініціалізації програми:

void LoadStdProfileSetting(UINT nMaxNRU = _AFX_MRU_COUNT) – завантажує список останніх файлів, що використовувалися (_AFX_MRU_COUNT=4).

void SetRegistryKey(LPCSTR lpszRegistryKey) – заставляє програму зберігати первинні на лаштування в реєстрі Windows а не в INI-файлі. Ключ lpszRegistryKey, за яким зберігаються ініціалізаційні дані програми в реєстрі має формат:

 

HKEY_CURENT_USER\Software\<НазваОрганізації>\<Програма>\<Секція>\<Змінна>

 

void EnableShellOpen() – дозволяє запускати програму подвійним клацанням миші на файлі, що асоціюється з програмою.

void RegistryShellFileTypes() – реєструє в реєстрі Windows типи файлів, що асоціюється з програмою.

void ParseCommandLine(CCommandLineInfo& rCmdInfo) – здійснює синтаксичний та семантичний аналіз командного рядка, що передається програмі та поміщає результати в об’єкт rCmdInfo.

BOOL ProcessShellCommand(CCommandLineInfo& rCmdInfo) – обробляє дані (аргументи) командного рядка.

UINT GetProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int Def) – при успішному пошуку - повертає ціле число, що міститься полі lpszEntry секції lpszSection реєстру чи INI-файлу, інакше значення за замовчуванням (Def).

BOOL WriteProfileInt(LPCTSTR lpszSection,LPCTSTR lpszEntry,int nVal) – записує ціле число (nVal) у відповідне поле секції реєстру чи INI-файлу. Якщо ключова запис відсутня то вона створюється.

CString GetProfileString(…), BOOL WriteProfileString(…) – читання, запис символьного рядка.

BOOL GetProfileBinary(…), BOOL WriteProfileBinary(…) – читання, запис двійкового масиву даних.

Основні віртуальні функції керування програмою:

virtual BOOL InitInstance() – викликається кожен раз при ініціалізації нового (додаткового) екземпляру програми. Ії наповнення повністю визначається розробником (в базовому класі, вона порожня). У ній зчитуються ініціалізаційні дані, реєструється та створюється основне вікно програми та інше.

virtual BOOL ExitInstance() – викликається з методу Run() для завершення біжучого екземпляру програми. У ній реалізовується збереження налаштувань програми в реєстрі чи INI-файлі, звільняються виділені програмі ресурси (ресурси стандартних елементів створених MFC звільняється автоматично).

virtual BOOL Run() – запускає та обслуговує основний цикл повідомлень програми, доки не отримає повідомлення WM_QUIT. Якщо черга повідомлень порожня, то запускає віртуальну функцію OnIdle() для фонової обробки.

virtual BOOL OnIdle(LONG lCount) – викликається в циклі обробки повідомлень, коли черга повідомлень порожня. Вона обновлює команди користувацького інтерфейсу, перемальовує елементи керування та інше. При пере визначення цієї функції обов’язково необхідно викликати функцію CwinnApp::OnIdle() базового класу. lCount – лічильник вкладених викликів.