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

Void cLab6View::OnDraw(cdc* pDc)

{ CLab6Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if(!CaretCreated) //перевірити, чи створювався раніше курсор

{ TEXTMETRIC textmetric; //заповнюється структура TEXTMETRIC з іменем textmetric

pDC->GetTextMetrics(&textmetric); //заповнення структури TEXTMETRIC

CreateSolidCaret(textmetric.tmAveCharWidth/8,

textmetric.tmHeight);

CaretPosition.x = CaretPosition.y = 0; //початкове положення новоствореного курсора

SetCaretPos(CaretPosition);

ShowCaret();

CaretCreated = true;

}

Далі можна залишити старий текст функції, курсор мигатиме у координатах (0,0)

}

Відкомпілювати та завантажити програму. У верхньому лівому вікні мигтить курсор.

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

Спочатку відобразимо текст, введений користувачем за допомогою функції pDC->TextOut(0,0,pDoc->StringData);

Потім потрібно пересунути курсор в кінець рядка, але попередньо потрібно вияснити, де вона закінчується. Для цього заповнимо об’єкт класу CSize з іменем size за допомогою методу GetTextExtent():CSize size = pDC->GetTextExtent(pDoc->StringData);

Перед тим, як виводити курсор у кінці рядка, потрібно його сховати за допомогою методу HideCaret():HideCaret(); Якщо не сховати курсор перед пересуванням, тоді його зображення може залишитися на попередньому місці

Тепер потрібно надати змінній x об’єкту CaretPosition координату кінця текстового рядка на екрані: CaretPosition.x = size.cx;

Далі пересуваємо курсор у нове положення і знову виводимо його на екран:

SetCaretPos(CaretPosition);

ShowCaret();

Таким чином, функція OnDraw матиме такий вигляд:

Void cLab6View::OnDraw(cdc* pDc)

{ CCaretsDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

If(!CaretCreated)

{ TEXTMETRIC textmetric;

pDC->GetTextMetrics(&textmetric);

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

CaretPosition.x = CaretPosition.y = 0;

SetCaretPos(CaretPosition);

ShowCaret();

CaretCreated = true;

}

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

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

HideCaret();

CaretPosition.x = size.cx;

SetCaretPos(CaretPosition);

ShowCaret();

}

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

Приховування та відображення курсора

При втраті фокусу програма отримує повідомлення WM_KILLFOCUS, а при отриманні - повідомлення WM_SETFOCUS.

Додати до класу CLab6View функцію OnKillFocus обробки повідомлення WM_KILLFOCUS та перейти у цю функцію.

Даний метод обробляє повідомлення про втрату фокусу, тому курсор потрібно сховати, функція матиме такий вигляд:

Void cLab6View::OnKillFocus(cWnd* pNewWnd)

{ CView::OnKillFocus(pNewWnd);

HideCaret();

// TODO:

}

Подібно до попереднього, додайте метод OnSetFocus() для обробки повідомлення WM_SETFOCUS та додайте до нього код для відображення курсора при отриманні фокуса: