Практична робота № 3
Мета: навчитися створювати додатки в середовищі Visual C++ 6.0 для роботу з текстом та створенням меню.
Хід роботи
-
Робота з клавіатурою
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
}