Клас 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 – лічильник вкладених викликів.