C++. Створення простого діалогового додатку Windows типу Dialog Based Application з використанням бібліотеки MFC




Створення простого діалогового додатку Windows типу Dialog Based Application з використанням бібліотеки MFC (Microsoft Foundation Classes)

Виконання

1. Завантажити MS Visual Studio.

 

2. Виклик проекту на C++.

Після завантаження MS Visual Studio треба викликати команду

File -> New -> Project

У вікні, що відкриється, вибрати шаблон C++ а в списку типів проектів вибрати MFC Application.

Ім’я папки, в якій зберігається проект, даємо, наприклад:

E:\Programs\CPP\Train-03

Ім’я додатку даємо MFCApplication1. Якщо встановлена опція “Create directory for solution” (створити директорію для рішення), то буде створена ще одна піддиректорія з іменем MFCApplication1.

05_02_00_001_01_

Рис. 1. Вибір додатку типу “MFC Application

У результаті, викликається майстер “MFC Application Wizard” (рис. 2). У вікні майстра висвітлюється інформація про поточні налаштування проекту, які можна залишити без змін натиском кнопки “Finish“.

Поточні налаштування проекту є наступні.

1. Підтримка проектом багатьох документів – MDI Application (MDI – Multiple Document Interface). Це означає, що додаток може одночасно тримати відкритими декілька документів, кожен з яких представлений окремим файлом.

2. Немає підтримки баз даних.

3. Немає підтримки складених (вбудованих) документів (контейнер, міні-сервер, повний сервер документів тощо).

4. Зовнішній вигляд додатку – піддається налаштуванню (панелі інструментів, панелі стану додатку тощо).

5. Зовнішній вигляд додатку такий як в MS Visual Studio 2008.

6. Стиль типу проекту як Visual Studio (оформлення панелей, відкриття документів тощо).

05_02_00_001_02_

Рис. 2. Опції налаштування, що є за замовчуванням

У нашому випадку вибираємо інший варіант, робимо клік на кнопці “Next >“.

Викликається вікно “Application Type“, яке зображене на рисунку 3.

05_02_00_001_03_

Рис. 3. Вікно Application Type

Пояснимо деякі поля вікна.

Тип додатку (Application Type):

  1. Single Document – підтримка SDI-додатку (Single Document Interface – інтерфейс з єдиним документом). Це є інтерфейс з єдиним документом, який дозволяє в кожен момент часу мати відкритим тільки один документ. Наприклад, редактор Notepad (Блокнот).
  2. Multiple Documents – підтримка MDI-додатку (Multiple Document Interface – “багатодокументний інтерфейс”). У цьому випадку в додатку може одночасно створюватись (відкриватись) декілька документів, кожен з яких представляється окремим файлом. Наприклад, текстовий редактор Microsoft Word старих версій є додаток типу MDI.
  3. Dialog Based – створення додатку як простого діалогового вікна, яке взагалі не відкриває документів. Наприклад, програма Калькулятор з пакету Windows.
  4. Multiple top level documents – підтримка багатодокументного інтерфейсу так само як і в MDI-додатку. Тільки в цьому випадку документи групуються в різних вікнах в панелі задач Windows, а не в межах додатку. Наприклад, нові версії Windows підтримують цей режим.

У нашому випадку потрібно вибрати Dialog Based, як показано на рисунку 3.

Поле “Use of MFC:” визначає, як потрібно формувати MFC бібліотеку. Є два варіанти. Перший варіант “Use MFC in a shared DLL” пропонує, щоб бібліотека MFC була розподіленою динамічно зв’язуваною бібліотекою (shared DLL). Використання DLL як динамічної бібліотеки скорочує об’єм додатку але дещо ускладнює встановлення продукту.






Другий варіант “Use MFC in a static library” пропонує, щоб бібліотека MFC була статично прикомпонованою. При цьому варіанті отримається більший за розмірами “.exe” файл, але не буде труднощів при супроводі додатку. У цьому випадку модулі бібліотеки прикомпоновані статично, тому додаток легко переміщується з одного комп’ютера на інший.

Для нашого додатку поки що немає значення який варіант формування MFC бібліотеки вибирати.

Після вибору “Next >” відкриється вікно “User Interface Features“. В цьому вікні пропонується вибрати оформлення фрейму (рамки) головного вікна додатку. Фрейм включає в себе системне меню, рядок заголовку, кнопки мінімізації та максимізації, межі вікна тощо.

05_02_00_001_04_

Рис. 4. Вибір оформлення фрейма (рамки) головного вікна додатку

Властивості фрейму “Main frame styles” є такі:

1. Thick frame (потовщена рамка). У цьому випадку межі вікна є потовщені.

2. Minimize box – кнопка мінімізації вікна.

3. Maximize box – кнопка максимізації вікна.

4. System menu – системне меню, яке розміщується в лівому верхньому куті вікна.

5. Minimized – режим, при якому під час запуску вікно додатку згортається в піктограму.

6. Maximized – режим при якому під час запуску вікно додатку розгортається на весь екран.

Вибір опцій можна встановити на власний розсуд.

У полі Dialog Title встановлюється назва додатку.

Після встановлення опцій фрейму робимо клік на “Next >“. У результаті відкриється вікно як показано на рисунку 5.

05_02_00_001_05_

Рис. 5. Вікно налаштування додаткових властивостей

У вікні на рисунку 5 є доступні опції налаштування додаткових властивостей додатку. Пояснимо деякі з них.

1. Context Sensitive Help (HTML) – контекстна довідка. Буде створено меню Help додатку, яке буде мати опції Index та Using Help.

2. Active X controls – дозволяє включати Active X елементи управління в додаток.

3. Automation – дозволяє додатку виставляти об’єкти для скріптів та інших додатків.

4. Windows sockets – дозволяє додатку мати безпосередній досту до Internet через протоколи FTP, HTTP.

Робимо клік на “Next >“. У останньому вікні (рис. 6) потрібно підтвердити імена класів та імен файлів, які створює MFC Application Wizard.

05_02_00_001_06_

Рис. 6. Запит до підтвердження імен створюваних класів

Залишаємо все як є і робимо клік на “Finish“. Сформується програмний код класів. Форма додатку матиме вигляд як показано на рис. 7.

05_02_00_001_07_

Рис. 7. Форма додатку після виконання майстра App Wizard

Тепер можна запустити додаток на виконання і проаналізувати його роботу

 

3. Класи, що створюються в додатку

У результаті виконаних дій, буде створено два класи з іменами CMFCApplication1App та CMFCApplication1Dlg.

Клас CMFCApplication1App є породжений від CWinApp. Цей клас є класом додатку в цілому.

Клас CMFCApplication1Dlg є класом діалогу для додатку в цілому.

Після створення додатку в Solution Explorer створюються файли класів (рис. 8).

Класу CMFCApplication1App відповідають файли “MFCApplication1.h” та “MFCApplication1.cpp“.

Класу CMFCApplication1Dlg відповідають файли “MFCApplication1Dlg.h” та “MFCApplication1Dlg.cpp“.

05_02_00_001_08_

Рис. 8. Файли додатку в Solution Explorer

Лістинг файлу заголовку “MFCApplication1.h” для додатку наступний:

// MFCApplication1.h : main header file for the PROJECT_NAME application
//
#pragma once

#ifndef __AFXWIN_H__
 #error "include 'stdafx.h' before including this file for PCH"
#endif

#include "resource.h" // main symbols

// CMFCApplication1App:
// See MFCApplication1.cpp for the implementation of this class
//

class CMFCApplication1App : public CWinApp
{
public:
 CMFCApplication1App();
// Overrides
public:
 virtual BOOL InitInstance();
// Implementation
DECLARE_MESSAGE_MAP()
};

extern CMFCApplication1App theApp;

У вище наведеному лістингу між директивою

#ifndef ... #endif

реалізовано запобігання повторного використання однакових імен файлів заголовків, які навіть можуть бути розміщені в різних папках.

Далі оголошується клас CMFCApplicationApp який є успадкований від класу CWinApp. Клас CWinApp включає в себе більшість функціональних можливостей, необхідних додатку.

Майстер AppWizard згенерував декілька функцій для класу-спадкоємця, які “перевантажують” власні функції базового класу.

У класі перевантажується віртуальна функція InitInstance().

Рядок

DECLARE_MESSAGE_MAP()

означає, що використовується карта повідомлень.

Реалізація класу CMFCApplication1App наведена у файлі CMFCApplication1App.cpp“.

Лістинг файлу “CMFCApplication1App.cpp” наведено нижче.

#include "stdafx.h"
#include "MFCApplication1.h"
#include "MFCApplication1Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CMFCApplication1App
BEGIN_MESSAGE_MAP(CMFCApplication1App, CWinApp)
 ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()

// CMFCApplication1App construction
CMFCApplication1App::CMFCApplication1App()
{
 // support Restart Manager
 m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: add construction code here,
 // Place all significant initialization in InitInstance
}

// The one and only CMFCApplication1App object
CMFCApplication1App theApp;

// CMFCApplication1App initialization
BOOL CMFCApplication1App::InitInstance()
{
 // InitCommonControlsEx() is required on Windows XP if an application
 // manifest specifies use of ComCtl32.dll version 6 or later to enable
 // visual styles. Otherwise, any window creation will fail.
 INITCOMMONCONTROLSEX InitCtrls;
 InitCtrls.dwSize = sizeof(InitCtrls);
 // Set this to include all the common control classes you want to use
 // in your application.
 InitCtrls.dwICC = ICC_WIN95_CLASSES;
 InitCommonControlsEx(&InitCtrls);
 CWinApp::InitInstance();
 AfxEnableControlContainer();
 // Create the shell manager, in case the dialog contains
 // any shell tree view or shell list view controls.
 CShellManager *pShellManager = new CShellManager;
 // Standard initialization
 // If you are not using these features and wish to reduce the size
 // of your final executable, you should remove from the following
 // the specific initialization routines you do not need
 // Change the registry key under which our settings are stored
 // TODO: You should modify this string to be something appropriate
 // such as the name of your company or organization
 SetRegistryKey(_T("Local AppWizard-Generated Applications"));

 CMFCApplication1Dlg dlg;
 m_pMainWnd = &dlg;
 INT_PTR nResponse = dlg.DoModal();
 if (nResponse == IDOK)
 {
 // TODO: Place code here to handle when the dialog is
 // dismissed with OK
 }
 else if (nResponse == IDCANCEL)
 {
 // TODO: Place code here to handle when the dialog is
 // dismissed with Cancel
 }
 
 // Delete the shell manager created above.
 if (pShellManager != NULL)
 {
 delete pShellManager;
 }

// Since the dialog has been closed, return FALSE so that we exit the
 // application, rather than start the application's message pump.
 return FALSE;
}

У вищенаведеному лістингу найбільший інтерес представляє функція InitInstance().

У функції InitInstance() створюється вікно додатку. Описується змінна dlg типу вікно додатку.

Рядок

m_pMainWnd = &dlg;

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

Потім викликається функція DoModal(), яка відкриває вікно додатку. Після виклику відбувається перевірка на значення, яке було повернуте після натиску на кнопках “OK” або “Cancel“.


Схожі теми: