- •О.С. Зеленський
- •Розділ 1. Загальні відомості створення додатку windows
- •1.1. Створення додатку Windows за допомогою майстра AppWizard
- •1.2. Варіанти майстрів для різних проектів
- •1.3. Короткий опис sdi програми
- •1.4. Короткий опис mdi програми
- •1.5. Короткий опис простого діалогового додатку
- •Контрольні питання
- •Розділ 2. Повідомлення і команди
- •2.1. Обробка повідомлень
- •2.2. Цикли обробки повідомлень
- •2.3. Карти повідомлень
- •Контрольні питання
- •Розділ 3. Документи та види
- •3.1. Клас додатку
- •3.2. Клас головного вікна
- •3.3. Клас документа
- •3.4. Класи виду
- •Контрольні питання
- •Розділ 4. Робота з клавіатурою, мишею і меню
- •4.1. Робота з клавіатурою
- •4.2. Робота з мишею
- •4.3. Робота з меню
- •Контрольні питання
- •Розділ 5. Виведення на екран
- •5.1. Класи графічних об'єктів
- •5.2. Робота зі шрифтами
- •5.3. Робота з пензликами та малювання графічних фігур
- •5.4. Робота з пензликом
- •5.5. Робота зі скролінгом
- •5.6. Приклад роботи з таблицями
- •5.7. Малювання на екрані маніпулятором "миша"
- •5.8. Завантаження та виведення на екран бітових зображень
- •5.9. Копіювання бітових образів
- •5.10. Малювання графічних об'єктів з використанням резинових контурів та метафайлів
- •5.11. Виділення графічних об'єктів у прямокутній області
- •5.12. Універсальний приклад роботи з двовимірною графікою з використанням резинового контуру
- •5.13. Запис на диск та зчитування з диску графічних об'єктів
- •5.14. Побудова кругових діаграм і гістограм
- •5.15. Користувацький режим роботи з графікою на прикладі малювання годинника Clock
- •Контрольні питання
- •Завдання
- •Розділ 6. Друк і попередній перегляд документів
- •6.1. Вибір і налаштування параметрів друку
- •6.2. Створення контекста пристрою
- •6.3. Друк документів і бібліотека mfc
- •6.4. Масштабування
- •6.5. Друк багатосторінкового документа
- •Контрольні питання
- •Розділ 7. Робота з файлами
- •7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream
- •7.1.1. Робота з класом cFile
- •7.1.2. Робота з потоком fstream
- •Можливі режими доступу
- •7.1.3. Робота з класом cStdioFile
- •7.2. Серіалізація даних, клас cArchive
- •7.3. Використання реєстру в додатках
- •Контрольні питання
- •Завдання
- •Розділ 8. Діалогові вікна
- •8.1. Створення діалогового вікна та простіші елементи керування
- •8.2. Робота зі списками і комбінованими полями
- •8.3. Ускладнений приклад зі списками
- •8.4. Робота з повзунками
- •8.5. Виведення бітових матриць в діалозі та у вікні виду
- •8.6. Лінійний регулятор, лінійний індикатор, інкриментний регулятор
- •8.7. Стандартні діалоги вибору файлів, шрифтів та кольору
- •8.8. Взаємоз'вязок діалога, документа та виду при розробці додатку
- •8.8.1. Клас cDialDoc
- •8.8.2. Клас cDialView
- •8.8.3. Клас Cdlg
- •8.9. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
Контрольні питання
1. Що відбувається при події WM_PAINT?
2. За яких умов відбувається подія WM_MOUSEMOVE?
3. Коли вікну відправляється повідомлення WM_DESTROY?
4. Що таке цикл обробки повідомлень?
5. Для чого використовуються карти повідомлень?
6. Коли відбувається подія WM_LBUTTONDOWN?
7. Яка відмінність між повідомленнями WM_KEYDOWN та WM_CHAR?
8. Коли створюється повідомлення WM_CLOSE?
9. Що відбувається при повідомленні WM_QUIT?
10. Яка відмінність між повідомленнями WM_CLOSE, WM_DESTROY та WM_QUIT?
Розділ 3. Документи та види
3.1. Клас додатку
У архітектурі Документ/Вид клас виду повинен бути пов'язаним із класом документа. Де і яким чином відбувається співставлення цих класів? Для того щоб відповісти на це та ряд інших питань, необхідно розглянути клас додатку.
Оскільки файли заголовків класів демонстраційних додатків, як правило, створюються майстром створення додатків відповідного типу і заповнюються автоматично з використанням можливостей, що надаються середовищем програмування, надалі їх тексти не будуть приводитися без особливої необхідності. Повні тексти програм, що включають тексти файлів заголовків, містяться на сайті кафедри. Тому надалі при розгляді додатків будуть дані лише тексти файлів реалізації.
Файл MDI.cpp, що є файлом реалізації класу додатка CMDIApp, приведено далі:
// Файл MDI.cpp визначає поведінку класу програми.
#include "stdafx.h"
#include "MDI.h"
#include "MainFrm.h"
#include "ChildFrm.h"
#include "MDIDoc.h"
#include "MDIView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// Клас CMDIApp
BEGIN_MESSAGE_MAP(CMDIApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// Стандартні команди для роботи з файлами документів
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Стандартні команди установки режиму друку
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
// Конструктор класу CMDIApp
CMDIApp::CMDIApp()
{
// ЗРОБИТИ: додати сюди текст конструктора.
// Всі процедури ініціалізації повинні розташовуватися
// у функції InitInstance
}
// Єдиний і неповторний об'єкт класу CMDIApp
CMDIApp theApp;
// Ініціалізація класу CMDIApp
BOOL CMDIApp::InitInstance()
{
CWinApp::InitInstance();
// Ініціалізація бібліотек OLE
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
)
AfxEnableControlContamer();
// Стандартна ініціалізація
// Якщо ви не використовуєте ці властивості і хочете
// зменшити розмір виконавчих файлів, видаліть
// непотрібні вам процедури ініціалізації.
// Змініть ключ системного реєстру, у якому будуть
// зберігатися параметри програми.
// ЗРОБИТИ: необхідно помістити в цей рядок що-небудь
// відповідне, наприклад, назву вашої компанії
// або організації
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(4); // Завантаження стандартного файлу INI
// (Включаючи список останніх відкритих файлів)
// Реєстрація шаблону документів додатка. Шаблони
// документів забезпечують взаємодію документів, рамок
// вікна і видів
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MDITYPE,
RUNTIME_CLASS(CMDIDoc),
RUNTIME_CLASS(CChildFrame), // Користувацька рамка
// вікна багатовіконної програми
RUNTIME_CLASS(CMDIView));
AddDocTemplate(pDocTemplate);
// Створення рамки вікна багатовіконної програми
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
// Якщо додаток може працювати з файлами, перенесеними у
// його вікно, то у додатках MDI відразу після
// установки значення m_pMainWnd слід викликати функцію
// DragAcceptFiles.
// Аналіз аргументів командного рядка, динамічний
// обмін даними (DDE) і відкриття файлу
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Диспетчеризація команд у командному рядку. Якщо
// додаток був запущений з ключами /RegServer,
// /Register, /Unregserver або /Unregister, функція
// повинна повертати значення FALSE
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// Виведення на екран головного вікна додатка після його
// ініціалізації
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
return TRUE;
}
// Клас діалогового вікна CAboutDlg
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Дані діалогового вікна
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // Підтримка DDX/DDV
// Реалізація
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// Виведення діалогового вікна
void CMDIApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
// Функції обробки повідомлень класу CMDIApp
Клас CMDIApp є нащадком класу CWinApp, який, у свою чергу, є нащадком класу CWinThread. Тому можна сказати, що даний клас є класом головного потоку програми. Наявність потоків є головною особливістю 32-розрядних систем Windows від їх 16-розрядних попередників, які були "узгоджуючим" багатозадачним середовищем без квантування часу. Це означає, що управління у завдання не віднімається після закінчення певного кванта часу. Для забезпечення можливості паралельної роботи багатьох програм в 16-розрядних системах Windows доводилося генерувати особливе переривання від таймера, яке припиняло виконання однієї програми і передавало управління іншій. Робота з таймером повністю покладалася на користувача.
У "витісняючих" середовищах, до яких відносяться і 32-розрядні системи Windows, операційна система виділяє кожному потоку квант часу, після закінчення якого його виконання переривається і операційна система вирішує, якому потоку слід передати управління. Потік являє собою деякий неподільний процес, що виконується у оперативній пам'яті комп'ютера, і має певний рівень пріоритету, що визначає порядок надання йому квантів часу. Потік може взаємодіяти з іншими потоками і породжувати їх.
Кожна програма, що використовує MFC, може містити лише один об'єкт класу, похідного від CWinApp. Цей об'єкт створюється на етапі створення глобальних об'єктів і вже існує на момент виклику функції WinMain, що міститься в бібліотеці MFC.
Функція InitInstance, що належить даному класу, слугує для створення об'єкта класу головного вікна додатку.