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

Void cLab6View::OnSetFocus(cWnd* pOldWnd)

{

CView::OnSetFocus(pOldWnd);

ShowCaret();

// TODO:

}

Компілюйте та завантажуйте програму. Теперь при отриманні фокуса курсор виникає, а при втраті - зникає.

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

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

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

Скориставшись ClassWizard, додати метод у клас Lab6View для обробки повідомлення Windows WM_LBUTTONDOWN; якому пропонується надати ім’я OnLButtonDown(). Клацнувши Edit Code перейти у дану функцію.

Окрім методу OnLButtonDown() можна скористатисяс й іншими методами для роботи з мишою - OnLButtonUp(), який відповідає за обробку відпускання лівої кнопки миші, OnRButtonDown(), який відповідає натисненню правої кнопки миші, OnLButtonDblClick(), який обробляє подвійне клацання лівою кнопкою, та ін. Методи для роботи з мишою наведені у таблиці нижче.

Методи ClassWizard для роботи з мишою

Метод

Призначення

OnLButtonDblClick

Викликається при подвійному клацанні лівою кнопкою миші

OnLButtonDown

Викликається при натисненні лівої кнопкои миші

OnLButtonUp

Викликається при відпусканні лівої кнопки миші

OnMButtonDblClick

Викликається при подвійному клацанні середньою кнопкою миші

OnMButtonDown

Викликається при натисненні середньої кнопки миші

OnMButtonUp

Викликається при відпусканні середньої кнопки миші

OnMouseActivate

Викликається при натисненні кнопки миші при розташуванні вказівника миші над неактивним вікном

OnMouseMove

Викликається при пересуванні вказівника миші

OnMouseWheel

Викликається при повороті колеса миші. Застосовується у WindowsNT4.0

OnRButtonDblClick

Викликається при подвійному клацанні правою кнопкою миші

OnRButtonDown

Викликається при натисканні правої кнопки миші

OnRButtonUp

Викликається при відпусканні правої кнопки миші

OnRegisteredMouseWheel

Викликається при повороті колеса миші. Застосовується у Windows95 та WindowsNT3.51

OnSetCursor

Викликається при пересуванні вказівника миші у вікні, якщо миша не була раніше захоплена додатком

Методу OnLButtonDown() передаються два параметри: nFlags та point. Перший містить інформацію про стан різних службових клавіш і може набувати наступних значень:

MK_CONTROL

Натиснена клавіша CTRL

MK_LBUTTON

Натиснена ліва кнопка миші

MK_MBUTTON

Натиснена середня кнопка миші

MK_RBUTTON

Натиснена права кнопка миші

MK_SHIFT

Натиснена клавіша SHIFT

Параметр point, об’єкт класу CPoint, містить поточні координати вказівника миші.

Коли кнопка миші натиснена, потрібно зберігати положення вказівника. Для цього потрібно додати змінні x та y до класу CLab6View, як це робилося для StringData.

У функції OnLButtonDown файлу Lab6View.срр надамо значення змінним х та у, отримані зі змінних x та y об’єкту point: x = point.x; y = point.y;

Клацання мишою означає, що текст буде виводитись у новому положенні - для очищення рядкового об’єкту скористатися методом Empty() класу CString:

pDoc->StringData.Empty();

Тепер потрібно оголосити поточний вміст вигляду недійсним, щоб перерисувати його та відобразити курсор у новому місці (відповідний код вже існує у методі OnDraw()). В результаті названих дій функція OnLButtonDown повинна мати такий вигляд:

void CLab6View::OnLButtonDown(UINT nFlags, CPoint point)

{

x = point.x;

y = point.y;

CLab6Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData.Empty();

Invalidate();

CView::OnLButtonDown(nFlags, point);

}

Координати вказівника миші збережені. Тепер потрібно вивести текст у місці, вибраному користувачем.

Для виведення тексту з заданої точки скористаємось готовим методом OnDraw().

void CLab6View::OnDraw(CDC* pDC)

{CLab6Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if(!CaretCreated)

{ TEXTMETRIC textmetric;

pDC->GetTextMetrics(&textmetric);

CreateSolidCaret(textmetric.tmAveCharWidth/8,textmetric.tmHeight);

CaretPosition.x = 0;CaretPosition.y = 0;

SetCaretPos(CaretPosition);

ShowCaret();

CaretCreated = true;

}

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

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

HideCaret();

CaretPosition.x = x+size.cx;

CaretPosition.y=y;

SetCaretPos(CaretPosition);

ShowCaret();

}

Завдання до лабораторної роботи.

  1. Виконати пункти 1.. 26 та пояснити алгоритм роботи програми – 15 балів