Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практическая работа № 3.doc
Скачиваний:
4
Добавлен:
04.12.2018
Размер:
206.34 Кб
Скачать

Практична робота № 3

Мета: навчитися створювати додатки в середовищі Visual C++ 6.0 для роботу з текстом та створенням меню.

Хід роботи

    1. Робота з клавіатурою

1.1.1 Виведення повідомлення

Створіть додаток з одним документом Onedocument. Додамо повідомлення для привітання «Practical work №3». Для цього програма використовує метод OnDraw() класу COnedocumentView. Цей клас використовується для відображення даних. Програма визиває метод OnDraw(), коли їй необхідно вивести щось в клієнтській області програми. На даний час цей метод виглядає так:

void COnedocumentView::OnDraw(CDC* pDC)

{

COnedocumentDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

}

Для виведення повідомлення необхідно змінити код методу:

Перейдіть на вкладку ClassView.

Знайдіть у ієрархічному списку клас COnedocumentView.

В цьому класі знайдіть метод OnDraw() та двічі клацніть на ньому, метод відкриється в текстовому редакторі.

Додайте до методу всього два рядки.

void COnedocumentView::OnDraw(CDC* pDC)

{

CString onedocument_string="Practical work3";

COnedocumentDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDC->TextOut(0,0,onedocument_string);

}

Запустіть програму для перевірки результату.

Клас CString включає всі операції з рядками. Потім в методі OnDraw() виводиться рядок через показник методу pDC, який маэ посилання на об’єкт класу MFC з імям CDC. Конкретно визивається метод TextOut() цього об’єкту. Цьому методу передаються координати верхнього лівого кута області вікна. Потім метод отримує сам рядок.

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

Створіть додаток з одним документом Keyboard. Робота з програмою ділиться на дві частини.

1.1.2 Підготовка буферу для зберігання даних.

Кожен новий символ, що вводить користувач, додається до рядку, що зберігається в об’єкті класу MFC CString. Назвемо цей рядок StringData і визначемо його у заготовочному файлі KeyboardDoc.h:

class CKeyboardDoc : public CDocument

{

protected: // create from serialization only

CKeyboardDoc();

DECLARE_DYNCREATE(CKeyboardDoc)

CString StringData;

Потім об’єкт необхідно проініціалізувати пустим рядком «». Це робиться у конструкторі об’єкта документа, що знаходиться у файлі KeyboardDoc.cpp:

CKeyboardDoc::CKeyboardDoc()

{

// TODO: add one-time construction code here

StringData="";

}

1.2.3 Читання натиснутих клавіш

Місце для збереження підготовлено, але треба зясувати, яка сама клавіша була натиснута користувачем. Для цього при кожному натисненні клавіші Windows посилає повідомлення WM_CHAR, яке необхідно зв’язати з методом OnChar(). Для цього використовується майстер ClassWizard.

Для того, щоб зв’язатися з майстром виконайте команду View->ClassWizard. На екрані зявиться вікно (рис.2.1). Оберіть вкладку Message Map.

Рисунок 2.1 – Майстер ClassWizard

Необхідно додати новий обробник повідомлень OnChar(), в класі CKeyboardView. У спсику Class name оберіть сааме його. Оберіть повідомлення WM_CHAR у списку Messages. У списку Member functions зявиться метод OnChar().

Знайдіть метод OnChar() в файлі KeyboardView.cpp.

void CKeyboardView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: Add your message handler code here and/or call default

CView::OnChar(nChar, nRepCnt, nFlags);

}

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

1.1.4 Збереження символу в документі.

Введений символ знаходиться в параметрі nChar і його необхідно зберегти в рядковому об’єкті StringData. Цей об’єкт належить документу тому спуршу необхідно отримати показник на об’єкт документу pDOC:

void CKeyboardView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: Add your message handler code here and/or call default

CKeyboardDOC* pDoc=GetDocument();

ASSERT_VALID(pDOC);

CView::OnChar(nChar, nRepCnt, nFlags);

}

Далы до рядка StringData додаємо символ nChar.

void CKeyboardView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: Add your message handler code here and/or call default

CKeyboardDOC* pDoc=GetDocument();

ASSERT_VALID(pDOC);

pDoc->StringData+=nChar;

CView::OnChar(nChar, nRepCnt, nFlags);

}

1.1.5 Відображення тексту.

Виведення у додатку буде там же – в методі OnDraw(). Щоб змусити програму визвати OnDraw() та перемалювати обновлений рядок необхідно визвати метод Invalidate().

void CKeyboardView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: Add your message handler code here and/or call default

CKeyboardDoc* pDoc=GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData+=nChar;

Invalidate();

CView::OnChar(nChar, nRepCnt, nFlags);

}

Тепер перейдимо до методу OnDraw() і додамо необхідний запис для виведення повідомлення.

void CKeyboardView::OnDraw(CDC* pDC)

{

CKeyboardDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDC->TextOut(0,0, pDoc->StringData);

// TODO: add draw code for native data here

}

1.1.6 Виведення тексту в центрі вікна

Для того щоб вирівняти текст по центру необхідно визначити два розміри: клієнтської області та текстового рядка на екрані.

Створіть новий додаток з одним документом centered. Проробіть попередні дії для робот из клавіатурою окрім виводу на екран.

Визначення розмірів вікна:

Для того,щоб вірно вивести рядок по центру необхідно знати розміри вікна. Для отримання розмірів клієнтської частини можна скористатися методом GetWindowRect() класа Cwnd.

Створіть обєкт класса Crect з імям rect і передайте показник на нього методу GetWindowRect() за допомогою оператору С++ &.

void CCenteredView::OnDraw(CDC* pDC)

{

CCenteredDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rect;

GetWindowRect(&rect);

// TODO: add draw code for native data here

}

Тепер використовуючи методи Width(), Height() класа CRect необхідно дізнатися де знаходиться центр клієнтської області.

void CCenteredView::OnDraw(CDC* pDC)

{

CCenteredDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rect;

GetWindowRect(&rect);

int x=rect.Width()/2;

int x=rect.Height()/2;

// TODO: add draw code for native data here

}

Визначення розміру текстового рядка:

Для визначення розміру рядка необхідно використати метод GetTextExtent() класа CDC. Цьому методу необхідно передати текстовий рядок, а він поверне розмір об’єкта у вигляді класса MFC CSize.

void CCenteredView::OnDraw(CDC* pDC)

{

CCenteredDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rect;

GetWindowRect(&rect);

int x=rect.Width()/2;

int x=rect.Height()/2;

CSize size=pDC->GetTextExtent(pDoc->StringData);

// TODO: add draw code for native data here

}

Клас CSize містить важливі змінні сх та су, в яких зберігаються розміри рядка. Знаючи ці значення можна вирівняти рядок по центру:

void CCenteredView::OnDraw(CDC* pDC)

{

CCenteredDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rect;

GetWindowRect(&rect);

int x=rect.Width()/2;

int x=rect.Height()/2;

CSize size=pDC->GetTextExtent(pDoc->StringData);

x-=size.cx/2;

y-=size.cy/2;

// TODO: add draw code for native data here

}

Залишилось лише вивести рядок за відомим координатами:

void CCenteredView::OnDraw(CDC* pDC)

{

CCenteredDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rect;

GetWindowRect(&rect);

int x=rect.Width()/2;

int y=rect.Height()/2;

CSize size=pDC->GetTextExtent(pDoc->StringData);

x-=size.cx/2;

y-=size.cy/2;

pDC->TextOut(x,y, pDoc->StringData);

// TODO: add draw code for native data here

}