- •1А. Побудова проекту додатка без майстра.
- •1Б. Побудова windows-додаткa за допомогою майстра
- •2. Розробка windows-додатку з діалоговим вікном
- •3.Програмування простих арифметичних виразів
- •Завдання до лабораторної роботи:
- •4.Створення файлів даних
- •Void cMyAppView::OnDraw(cdc* pDc)
- •Використання постійних наборів даних. Серіалізація
- •6.Робота з клавіатурою та мишою.
- •Void cLab6View::OnChar(uint nChar, uint nRepCnt, uint nFlags)
- •Void cLab6View::OnChar(uint nChar, uint nRepCnt, uint nFlags)
- •Void cLab6View::OnDraw(cdc* pDc)
- •Void cCenteredView::OnDraw(cdc* pDc)
- •Void cLab6View::OnDraw(cdc* pDc)
- •Void cLab6View::OnDraw(cdc* pDc)
- •If(!CaretCreated)
- •Void cLab6View::OnKillFocus(cWnd* pNewWnd)
- •Void cLab6View::OnSetFocus(cWnd* pOldWnd)
- •7.Обробка текстових даних.
- •Void cTextView::OnDraw(cdc* pDc)
- •8.Обробка одномірних масивів.
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •9. Обробка двомірних масивів.
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •10. Функції. Перевантаження та шаблони функцій.
- •Додаток1.Пояснення архітектури документ/облік
- •Додаток2.Аналіз коду, створеного майстром у lab4
- •MainFrm.H и MainFrm.Cpp
- •Lab4View.H та lab4View.Cpp
- •Список літератури
Додаток2.Аналіз коду, створеного майстром у lab4
При розробці програм у Visual C++ можна використовувати майстри (wizards) - наприклад, Visual C++ AppWizard.
1. Відкрийте проект LAB4, створений для лабораторної роботи 4. При цьому створюються наступні файли:
LAB4.clw |
Файл ClassWizard |
LAB4.dsw |
Основний файл робочої області |
LAB4.h |
Заголовковий файл додатку |
LAB4.cpp |
Вхідний текст додатку |
StdAfx.h |
Заголовковий файл для стандартного «каркасу» додатку |
StdAfx.cpp |
Вхідний текст стандартного «каркасу» додатку |
MainFrm.h |
Заголовковий файл головного вікна |
MainFrm.cpp |
Вхідний текст головного вікна |
LAB4Doc.h |
Заголовковий файл документу |
LAB4Doc.cpp |
Вхідний текст документу |
LAB4View.h |
Заголовковий файл вигляду |
LAB4View.cpp |
Вхідний текст вигляду |
Resource.h |
Файл з ресурсними константами |
LAB4.rc |
Файл з ресурсами |
LAB4.ncb |
Файл з інформацією про представлення та взаємні зв’язки |
LAB4.dsp |
Файл проекту |
res |
Каталог для ресурсів |
AppWizard також створює файл з іменем ReadMe.txt, у якому докладніше пояснюється призначення деяких файлів, створених AppWizard:
AppWizard відмічає коментарем "TODO:" ті фрагменти вхідного тексту, які можна доповнювати чи змінювати.
Частини програми у Visual C++
Программа, створена Visual C++ AppWizard, складається з чотирьох основних частин: об’єкту додатку, об’єкту головного вікна, об’єкту документу та об’єкту вигляду.
Об’єкт додатку, розташований у файлах LAB4.h та LAB4.cpp (файл .h містить визначення констант, а також оголошення змінних та методів класу),- це те, що Windows завантажує як програму. Коли цей об’єкт починає працювати, тоді розташовує на екрані головне вікно.
Об’єкт головного вікна відтворює на екрані програму; у ньому розташовані меню, заголовок вікна та панель інструментів. Об’єкт головного вікна відповідає за все, що відбувається навколо того місця, де власне працює програма (де вона рисує, виводить текст, тощо.). Робоча зона програми називається клієнтською областю вікна; наприклад, текст виводиться у клієнтській області текстового редактора. За роботу з клієнтською областю відповідає об’єкт вигляду.
Об’єкт вигляд призначений для роботи з клієнтською областю - місцем, де найчастіше відображаються у відповідному форматі дані програми (наприклад, текст, якщо ведеться робота з текстовим редактором). Насправді об’єкт вигляду є вікно, яке накладається поверх клієнтської області. Об’єкт вигляду відображає дані, які зберігаються в об’єкті документу.
Об’єкт документу - зберігає дані програми. Дані не зберігаються у об’єкті вигляду через те, що таких даних може бути багато, і всі вони не вмістяться у клієнтській області. Visual C++ дозволяє зберігати всі дані в об’єкті документу, а потім доручити об’єкту вигляду відобразити лише ті дані, які потрапляють у клієнтську область об’єкту вигляду. Для одного документу можна мати кілька одночасно відкритих виглядів.
Взаємозв’язок чотирьох частин програми LAB4 у Visual C++ має такий вигляд:
Розглянемо докладніше об’єкт додатку
Об’єкт додатку виконує три задачі: завантажити програму, побудувати головне вікно та організувати передаванні повідомлень Windows.
Повідомлення Windows -це особливі сигнали, завдяки яким різні об’єкти у середовищі Windows спілкуються між собою. Наприклад, коли користувач завершує роботу програми, тоді Windows надсилає об’єкту додатку повідомлення WM_QUIT. Коли ж користувач змінює розміри вікна програми, тоді вона отримує повідомлення WM_SIZE. Найчастіше використовувані повідомлення Windows наведені у табл. 2.1.
Таблиця 2.1. Деякі повідомлення Windows
Повідомлення Windows |
Значення |
WM_ACTIVATE |
Вікно встановлюється як активне чи неактивне |
WM_ACTIVATEAPP |
Вікно, яке активизується, належить іншому додатку |
WM_CANCELMODE |
Відміна системного режиму |
WM_CHILDACTIVATE |
Активизується дочірнє вікно |
WM_CLOSE |
Вікно було зачинене |
WM_CREATE |
Викликалась функція побудови вікна |
WM_DESTROY |
Викликалась функція знищення вікна |
WM_ENABLE |
Вікно було заблоковане чи розблоковане |
WM_ENDSESSION |
Сеанс роботи завершується |
WM_ENTERIDLE |
Початок пасивного циклу, який можна використовувати для потреб програми |
WM_ERASEBKGND |
Потрібно стерти фон вікна |
WM_GETMINMAXINFO |
Отримання інформації про розміри вікна |
WM_GETTEXT |
Отримання тексту, поєднаного з вікном |
WM_GETTEXTLENGTH |
Отримання довжини тексту, поєднаного з вікном |
WM_ICONERASEBKGND |
Потрібно стерти фон вікна |
WM_KILLFOCUS |
Вікно втрачає фокус введення |
WM_MENUCHAR |
Користувач натиснув клавішу, яка не використовується у поточному меню |
WM_MENUSELECT |
Вибрана команда меню |
WM_MOVE |
Вікно пересунулось |
WM_PAINT |
Перерисувати частину вікна |
WM_PAINTICON |
Перерисувати частину значка додатку |
WM_PARENTNOTIFY |
Вікно будується чи знищується |
WM_QUERYENDSESSION |
Отримана команда на завершення сеансу |
WM_QUIT |
Завершення роботи додатку |
WM_SETFOCUS |
Вікно отримало фокус введення |
WM_SETFONT |
Змінився шрифт |
WM_SETREDRAW |
Відміняє прапорець перерисування |
WM_SETTEXT |
Задає текст у заголовку вікна |
WM_SHOWWINDOW |
Вікно потрібно сховати чи вивести на екран |
WM_SIZE |
Змінився розмір вікна |
Об’єкт додатку відсилає більшість отриманих повідомлень об’єкту головного вікна (не враховуючи повідомлення WM_QUIT, яке завершує роботу об’єкта додатку).
Код об’єкту додатку міститься у файлі LAB4.cpp. Найцікавішим є метод InitInstanсe(), оскільки саме в ньому програма збирає всі інші класи (головного вікна, документу та вигляду) та поєднує їх у шаблон документу, відповідно до якого об’єкт додатку організує роботу програми:
BOOL C LAB4App::InitInstance()
{ AfxEnableControlContainer(); // Стандартне ініціювання
// Якщо не використовуються деякі функції і потрібно скоротити розмір виконавчого //файлу, тоді видаліть непотрібні процедури ініціювання.
#ifdef _AFXDLL
Enable3dControls(); // Викликається при використанні MFC у вигляді сумісної DLL
#else
Enable3dControlsStatic(); // Викликається при статичному компонуванні MFC
#endif
// Змінити ключ реєстру, під яким будуть зберігатися параметри. Можна замінити рядок особистим визначенням- наприклад, назвою кампанії чи організації.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Завантажити стандартні параметри з INI-файлу (разом з MRU)
// Зареєструвати шаблони документів додатку. Шаблони документів поєднують
// документи, обрамлені вікна та вигляди.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CLAB4Doc),
RUNTIME_CLASS(CMainFrame), // Головне обрамлене вікно SDI
RUNTIME_CLASS(CLAB4View));
AddDocTemplate(pDocTemplate);
// Переглянути командний рядок у пошуку стандартних команд оболонки, DDE та
// відкриття файлів
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Організувати обробку команд, що містяться у командному рядку
if (!ProcessShellCommand(cmdInfo)) return FALSE;
// Ініційоване лише одне вікно; відобразити та поновити його.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE; }
Важливим є рядок m_pMainWnd->ShowWindow(SW_SHOW); в кінці методу InitInstance(). Саме у ньому об’єкт додатку відображає головне вікно програми, викликаючи метод ShowWindow() об’єкту головного вікна. Змінна m_pMainWnd містить вказівник на об’єкт головного вікна, а оператор -> діє так же, як і оператор . («крапка»), тільки він працює з вказівником на об’єкт. Іншими словами, цей оператор дає змогу звертатися до змінних та методів того об’єкту, на який посилається даний вказівник.
Імена змінних класів у Visual C++ мають стандартний префікс m_. У Visual C++ подібні префікси застосвуються для всіх імен змінних (так званий «угорський запис»). Префікс означає тип змінної; наприклад, префікс c застосовується для символьних типів, тому одразу зрозуміло, що cInput - символьна змінна. Найрозповсюдженіші префікси угорського запису наведені у табл. 2.2.
Таблиця 2.2. Префікси угорського запису
Префікс |
Значення |
a |
Масив |
b |
Логічний тип (int) |
by |
Беззнаковий символьний тип (byte) |
c |
Символьний тип |
cb |
Лічильник байтів |
cr |
Колір |
cx, cy |
Короткий тип (short) |
dw |
Беззнаковий довгий тип (dword) |
fn |
Функція |
h |
Логічний номер (handle) |
i |
Ціле |
m_ |
Змінна класу |
n |
short або int |
np |
Ближній вказівник |
p |
Вказівник |
l |
Довгий тип (long) |
lp |
Довгий вказівник |
s |
Рядок |
sz |
Рядок, що завершується нулльовим-символом |
tm |
Текстова метрика |
w |
Беззнакове ціле (word) |
x, y |
Короткий тип (координата x або y) |
Вхідний текст об’єкту додатку знаходиться у файлах LAB4.h/ LAB4.cpp.
LAB4.h та LAB4.cpp
// LAB4.h : головний заголовковий файл для додатку LAB4
#if !defined(AFX_WELCOME_H__AF072C83_900A_11D0
_8860_444553540000__INCLUDED_)
#define AFX_WELCOME_H__AF072C83_900A_11D0_8860
_444553540000__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file
for PCH
#endif
#include "resource.h" // основні символьні константи
// LAB4App:
// Реалізація цього класу міститься у файлі LAB4.cpp
class CLAB4App : public CWinApp
{ public:
CLAB4App();
// Перевизначення
// Перевизначення віртуальних функцій, згенеровані ClassWizard
//{{AFX_VIRTUAL(CLAB4App)
public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL
// Реалізація
//{{AFX_MSG(CLAB4App)
afx_msg void OnAppAbout();
// Тут ClassWizard вставляє та видаляє функції класу.
// Не можна змінювати вміст даних фрагментів згенерованого коду!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio вставляє додаткові оголошення перед попереднім рядком.
#endif //!defined(AFX_WELCOME_H__AF072C83_900A_11D0_8860
// _444553540000__INCLUDED_)
// LAB4.cpp : визначає поведінку класів данного додатку.
#include "stdafx.h"
#include "LAB4.h"
#include "MainFrm.h"
#include "LAB4Doc.h"
#include "LAB4View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CLAB4App
BEGIN_MESSAGE_MAP(CLAB4App, CWinApp)
//{{AFX_MSG_MAP(CLAB4App)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// Тут ClassWizard додає та видаляє макроси схеми.
// Не можна змінювати вміст даних фрагментів згенерованого коду!
//}}AFX_MSG_MAP
// Стандартні файлові команди документу
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()
// Конструктор CLAB4App
CLAB4App::CLAB4App()
{ // TODO: додайте код конструктора
// Ініціювання найважливіших змінних та функцій повинне виконуватися у InitInstance
}
// Єдиний об’єкт класу CLAB4App
CLAB4App theApp;
// ініціювання CLAB4App
BOOL CLAB4App::InitInstance()
{ AfxEnableControlContainer();
// Стандартне ініціювання
// Якщо не використовуються деякі функції і бажано скоротити розмір виконавчого
// файлу, тоді можна видалити непотрібні процедури ініціювання
#ifdef _AFXDLL
Enable3dControls(); // Викликається при використанні MFC у вигляді сумісної DLL
#else
Enable3dControlsStatic(); // Викликається при статичному компонуванні MFC
#endif
// Змінити ключ реєстру, під яким зберігатимуться параметри. Можна замінити рядок
// особистим визначенням - наприклад, назвою компанії чи організації
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Завантажити стандартні параметри з INI-файлу (разом з MRU)
// Зареєструвати шаблони документів додатку
// Шаблони документів поєднують документи, обрамлені вікна та вигляди
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CLAB4Doc),
RUNTIME_CLASS(CMainFrame), // Головне обрамлене вікно SDI
RUNTIME_CLASS(CLAB4View));
AddDocTemplate(pDocTemplate);
// Переглянути командний рядок у пошуку стандартних команд оболонки, DDE
// та відкриття файлів
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Організувати обробку команд, що містяться у командному рядку
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// Ініційоване лише одне вікно; відобразити та поновити його.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE; }
// Вікно діалогу CAboutDlg, що відображається командоюй About
class CAboutDlg : public CDialog
{ public:
CAboutDlg();
// Діалогові дані
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// Перевизначення віртуальних функцій, згенеровані ClassWizard
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);
// Підтримка DDX/DDV
//}}AFX_VIRTUAL
// Реалізація
protected:
//{{AFX_MSG(CAboutDlg)
// Обробники повідомлень відсутні
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{ //{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{ CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// Обробники повідомлень відсутні
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// Команда додатку для виклику вікна діалогу
void CLAB4App::OnAppAbout()
{ CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
// Команди CLAB4App
Розглянемо об’єкт головного вікна
Об’єкт головного вікна відповідає за всю роботу вікна програми, за винятком клієнтської області:
Це означає, що об’єкт головного вікна відповідає за заголовок, рядок меню, панель інструментів та рядок стану у нижній частині вікна. Заголовок та рядок меню створюються автоматично при побудові вікна, а панель інструментів та рядок стану додаються у методі OnCreate(). У файлі MainFrm.cpp це робиться так:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{ TRACE0("Failed to create toolbar\n"); return -1; // невдала спроба створення
}
if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{ TRACE0("Failed to create status bar\n"); return -1; // невдала спроба створення
}
// TODO: Видаліть цей рядок, якщоне потрібні підказки чи можливість зміни розмірів
// панелі інструментів
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
// TODO: Видаліть наступні три рядки, коли не потрібна закріплювана панель
// інструментів
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0; }
Не дивлячись на те, що меню та панель інструментів відображаються об’єктом головного вікна, у ньому майже немає коду для виконання цієї задачі. Основна частина тексту зосереджена у об’єкті вигляду - вікні, яке накриває клієнтську область. Головне вікно також відображає об’єкт вигляду, тому після короткого знайомства з об’єктом головного вікна розглянемо об’єкт вигляду. Вхідний текст об’єкту головного вікна знаходиться у файлах MainFrm.h/MainFrm.cpp.
