Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

Контрольні питання

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, що належить даному класу, слугує для створення об'єкта класу головного вікна додатку.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]