Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабробС++1к.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.06 Mб
Скачать

Додаток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.