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

Void cLab6View::OnChar(uint nChar, uint nRepCnt, uint nFlags)

{ CLab6Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData += nChar;//збереження символа у документі

Invalidate(); //виклик OnDraw() та перерисування поновленого рядка

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

}

Цей метод спонукає програму перерисувати об’єкт вигляду методом OnDraw(), тому потрібно перейти до методу OnDraw():

Void cLab6View::OnDraw(cdc* pDc)

{ CLab6Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDC->TextOut(0, 0, pDoc->StringData);//вивести рядок символів

}

Компілюйте та завантажуйте на виконання програму. Введіть довільний текст та перегляньте на екрані відповідний текст. Текст відображатиметься починаючи з лівого верхнього кута клієнтської області.

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

Визначення розмірів вікна. Для отримання розмірів клієнтської області застосовується метод GetWindowRect() класу CWnd, якому передається вказівник на об’єкт класу CRect, який застосовується для збереження розмірів прямокутника, яким є клієнтська область.

Створивши об’єкт класу CRect з іменем rect, передаємо вказівник на нього методу GetWindowRect() за допомогою оператора & мови С++:

Void cCenteredView::OnDraw(cdc* pDc)

{

CCenteredDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rect; //створити об’єкт класу CRect з іменем rect

GetWindowRect(&rect);// передати вказівник на об’єкт rect методу //GetWindowRect()

int x = rect.Width()/2;// ширина прямокутника, метод CRect

int y = rect.Height()/2; //висота прямокутника, CRect.

// х, у –центр клієнтської області

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

// розміри текстового рядка

// центр рядка повинен співпадати з центром клієнтської області.

x -= size.cx/2; // сx, cy зберігають розміри рядка.

y -= size.cy/2;

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

}

Для визначення розмірів всього головного вікна, разом з заголовком, рядком стану, можна скористатися в об’єкті вигляду GetParent()->GetWindowRect().

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

Програма не підтримує клавішу Delete тому, що у Windows текст відображається на екрані як графіка, тому для видалення символа потрібно зафарбувати його кольором фону. Для цього можна повторно вивести символ, який потрібно стерти, попередньо надавши йому колір фону. Колір тексту визначається методом SetTextColor(), а колір фону повертає метод GetBackColor().

Работа з мишою

Миша може породжувати кілька видів повідомлень: від WM_LBUTTONDOWN (при натисканні лівої кнопки) до WM_MOUSEMOVE (при пересуванні миші).

Удосконалимо програму для читання символів, розроблену у пунктах 1..10. Користувач бажає мати можливість вибрати довільну точку клієнтської області, клацнувши на ній мишою, і далі введений текст відображатиметься з вказаного місця.

Для вибору точки, де виникатиме текст, потрібен курсор, наприклад, вертикальна лінія, яка мигтить та позначує положення наступного введеного символа. Оскільки користувачу дозволяється самостійно вибрати розташування тексту у вікні, ми повинні працювати з курсором.

Створення курсора у вікні

Розташуємо курсор у лівому верхньому куті клієнтської області. Потім, при введенні символів, рядок відображатиметься у лівому верхньому куті та зсуватиме курсор у кінець тексту, позначуючи положення наступного символа.

Курсор створюється у об’єкті вигляду. Для нього потрібно вибрати розмір (курсори не мають стандартних розмірів), тому потрібно мати відомості про текст, з яким будемо працювати. Найчастіше висота курсора співпадає з висотою символів поточного шрифту, а його ширина дорівнює 1/8 середньої ширини символів. Для визначення висоти та ширини символів застосовується метод GetTextMetrics() класу CDC (клас CDC призначений для роботи з контекстом пристрою).

Визначення параметрів шрифту за структурою ТTEXTMETRIC

Курсор створюватиметься у методі OnDraw(). Для цього в об’єкті вигляду створюється логічна змінна з іменем CaretCreated(ім’я довільне), за значенням якої можна визначити, чи створювався курсор раніше. Логічні змінні, які також називаються прапорцями, можуть набувати лише двох значень: “істина” (true) та “хибність” (false).

Додати до Lab6View змінну CaretCreated типу вoolean та надати їй значення false у конструкторі Lab6View (як при додаванні StringData)/

Відредагувати функцію OnDraw() відповідно до наведеного нижче тексту (виділений).

Пояснення тексту функції OnDraw(). Якщо курсор ще не створений, тоді потрібно його створити. Для цього спочатку вибирається розмір курсора. Потрібну інформацію для вибору дає структура TEXTMETRIC, але спочатку викликається метод GetTextMetrics() для заповнення структури типу TEXTMETRIC, яка складається з наступних полів:

typedef struct tagTEXTMETRIC { // tm

LONG tmHeight;

LONG tmAscent;

LONG tmDescent;

LONG tmInternalLeading;

LONG tmExternalLeading;

LONG tmAveCharWidth;

LONG tmMaxCharWidth;

LONG tmWeight;

LONG tmOverhang;

LONG tmDigitizedAspectX;

LONG tmDigitizedAspectY;

BCHAR tmFirstChar;

BCHAR tmLastChar;

BCHAR tmDefaultChar;

BCHAR tmBreakChar;

BYTE tmItalic;

BYTE tmUnderlined;

BYTE tmStruckOut;

BYTE tmPitchAndFamily;

BYTE tmCharSet;

} TEXTMETRIC;

Тепер можна створювати курсор. Його висота дорівнюватиме висоті символів (textmetric.tmHeight), а ширина - 1/8 середньої ширини символа (textmetric.tmAveCharWidth/8). Для створення курсора застосовується метод CreateSolidCaret():

Існує також метод CreateGrayCaret() для створення затушованого, “сірого” курсора. До того ж для роботи з курсорами призначені методи ShowCaret(), SetCaretPos() та HideCaret().

Встановлення позиції курсора

Положення курсора зберігатиметься у новому об’єкті класу CPoint з іменем CaretPosition. Клас CPoint містить дві змінні, x та y, куди записуватимуться значення координат. Новостворений курсор вміщується у точку з координатами (0, 0).

Для відображення курсора потрібно виконати такі дії:

1)у файлі CLab6View.h при оголошенні класу class CLab6View : public CView

у розділі

// Implementation

public:

virtual ~CLab6View();

додати

boolean CaretCreated; // оголошення логічної змінної для визначення курсора

CPoint CaretPosition;// оголошення змінної для визначення позиції курсора

int x,y; // змінні, що міститимуть координати курсора по горизонталі та вертикалі

2) у файлі CLab6View.срр задати початкове значення логічної змінної CaretCreated:

Для цього відшукати функцію-конструктор CLab6View::CLab6View() та додати рядок

CLab6View::CLab6View()

{ CaretCreated=FALSE; //початкове значення змінної CaretCreated

}

Наведена нижче функція OnDraw створює курсор та приєднує його до об’єкту вигляду, задає його положення методом SetCaretPos(). Потім вказується позиція курсора методом SetCaretPos(), відображаємо курсор на екрані (ShowCaret()) та встановлюємо значення прапорця CaretCreated у true: