Mfc під ковпаком або створення mfc додатки без app wizard

Найчастіше створення нового MFC додатки доручається Візард (MFC App Wizard). Візард генерує основний кістяк додатки, який, ми надалі заповнюємо за потрібне кодом, в кінцевому рахунку отримуючи готове додаток.

Отримуючи таку заготовку для нашої майбутньої програми, відразу кидається в очі велика кількість коду, який певною мірою здається нам трохи хитрим, а почасти й незрозумілим, та плюс до всього постійно присутнє відчуття, що пристойну кількість коду приховано від наших очей. Пропоную пролити трохи світла на таємничі ділянки коду, який для нас генерує турботливий візард. А заодно і подивимося як самостійно, без допомоги візарду, створювати MFC додатки.

Отже, трохи про прихований коді

Кожне 32 бітове Windows додаток має два основних елементи: функції WinMain і WndProc. Ваша програма обов'язково повинна як мінімум одну WinMain, плюс WndProc для кожного вікна. Хоча MFC і створює за їх за Вас, але все-таки мати уявлення про них бажано.

Основне завдання WinMain - це запуск програми. Як тільки додаток запущено, Windows відразу ж поміщає повідомлення Вашого застосування в чергу повідомлень. Щоб отримати ці повідомлення від операційної системи і обробити їх, WinMain робить три API виклику. Перший - це GetMessage, завдання якого отримати повідомлення. Потім TranslateMessage для підготовки необхідних перетворень повідомлення. І в звключеніе WinMain викликає DispatchMessage, який говорить операційній системі якого WndProc відправити повідомлення для обробки.

Як тільки WndProc отримує повідомлення, то відразу починає пропускати через відповідні обробники, щоб виконати певні дії, необхідні для даного повідомлення. Ваше завдання, як програміста - написати дані обробники.

Найпростіше MFC додаток: Менше 20-ти рядків коду

Далі ми розглянемо найпростішу структуру MFC додатки. Так як наша задача забезпечити присутність в додатку WinMain і WndProc, то необхідно успадкувати для цих функцій MFC класи.

Клас додатки ми будемо наслідувати від MFC класу CWinApp. CWinApp всі необхідні функції і змінні для ініціалізації, запуску і виходу з програми. CWinApp так само містить покажчик m_pMainWnd, який вказує на об'єкт класу основного вікна. Кожне MFC прокладання має один і тільки один об'єкт, успадкованих безпосередньо від CWinApp. У прикладі, наведеному нижче, він має назву "CMyApp."

Клас, який обслуговує вікно, будемо наслідувати від CFrameWnd. CFrameWnd так само має всі необхідні функції і змінні, необхідні для створення і управління вікнами. Зверніть увагу, що фактично створення об'єкта вікна не тягне за собою безпосереднє створення самого вікна, а лише містить в собі функцію Create (), необхідну для створення вікна.

Давайте подивимося, що відбувається під час запуску нашої програми. Ці етапи можна відстежити в наведеному нижче прикладі:

WinMain починає працювати з точки: CMyApp app; Створюється об'єкт типу CMyApp з ім'ям "app." App містить всі змінні-члени і функції CWinApp, які необхідні для запуску і завершення нашої програми.

Потім WinMain викликає функцію InitInstance () нашого app. InitInstance () створює новий об'єкт CMyWnd з m_pMainWnd = new CMyWnd;

Конструктор CMyWnd викликає функцію Create (), яка створює екземпляр вікна, але не відображає його.

Далі функція InitInstance () відображає вікно командою m_pMainWnd-> ShowWindow (m_nCmdShow);

WinMain викликає функцію Run (), яка посилає повідомлення іншої частини програми.

А ось власне сам приклад:

Ось що ми отримаємо після компіляції цього коду і запуску:

Mfc під ковпаком або створення mfc додатки без app wizard

Фактично вікно буде більше.

Інтерфейс однодокументний (Single Document) додатки

Код, який генерується Візард при створенні однодокументний додатки (SDI), більш складний на перший погляд, але працює все за тими ж принципами. Ми так само успадковуємо клас від CWinApp. І успадковуємо все той же клас управління вікном від CFrameWnd. Однак, в даному випадку, клас управління вікном буде називатися CMainFrame.

Наш клас додатки так само має функцію InitInstance (), але виглядає вона вже трохи складніше. Крім усього іншого вона містить такі рядки:

Тут об'єкт докладання створює покажчик на однодокументний шаблон і пов'язує його з новим об'єктом однодокументний шаблону. Ми бачимо, що в конструктор CSingleDocTemplate передається чотири параметри. Перший типу integer - це ID ресурсу IDR_MAINFRAME. Наступні три параметри вказують на класи для документа, фрейми, і виду. Потім покажчик на новий CSingleDocTemplate додається в список шаблонів документів, створюваний об'єктом докладання. (В SDI додатку тільки один шаблон.)

Ресурс IDR_MAINFRAME містить:

  • Іконку програми.
  • Меню додатка.
  • Таблицю акселераторів для меню.
  • Рядок документа. Рядок документа розбита на сім частин, відокремлених один від одного символом '\ n':
  • Заголовок вікна основного вікна. Заголовок вікна присвоюється новому документу. Якщо пропущено, то застосовується значення за замовчуванням "Untitled."
  • Опис типу документа в MDI додатку. Цей рядок не використовується в SDI додатку. Опис типу документа, з розширенням файлу для даного документа за замовчуванням, наприклад, "My Big Program (*. Mbp)."
  • Трибуквених розширення для типу документа, наприклад ".mbp"
  • Ім'я без пробілів, яке ідентифікує тип документа в реєстрі.
  • Детальний ім'я типу документа, наприклад, "My Big Program Document." Приблизно так цей рядок може виглядати: "My Big Program \ n \ n \ nMy Big Program (*. Mbp) \ n.mbp \ nBigProgram \ nMBP Document."

висновок

Отже, тепер Ви маєте більше уявлення, про те, що відбувається після того, як дається команда Візард згенерувати новий каркас додатка, а так само можете в разі необхідності змінити деякі ділянки згенерованого коду на Ваш розсуд. Наприклад, якщо необхідно змінити розмір і положення основного вікна програми, то досить трохи змінити функцію Create (). Якщо Ви замініть у вищенаведеному прикладі код на наступний, то отримаєте вікно меншого розміру, розташоване у верхньому лівому кутку екрана.

Коротше кажучи, існує безліч налаштувань і функцій, з якими можна погратися. Звичайно Вам зовсім необов'язково змінювати код, що генерується Візард, але чим більше Ви будете знати про те, які процеси відбуваються в додатку, тим якісніше воно буде.

Схожі статті