Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

4.2. Робота з мишею

Приклад роботи з мишею знаходиться у папці DISK\Nach\carets.

У даній програмі на екран дисплею виводиться текст, символи якого вводяться користувачем з клавіатури. При цьому текст виводиться відносно курсору, положення якого встановлюється курсором миші. Тобто, користувач за допомогою курсору миші (натиснення лівої кнопки) формує початок виведеного тексту на екрані. У даному прикладі акцент робиться на роботу з мишею і курсором.

Проект формується також як і в попередньому прикладі (додаток Single). Найменування програми Carets.

Послідовність роботи.

1. У класі CCaretsDoc вводиться (як і в попередньому прикладі) змінна StringData. Вона ініціалізується в конструкторі даного класу.

2. Зміни та доповнення виконані в класі CCaretsView. Цей клас доповнено наступними змінними та функціями, які сформовані ClassWizard.

2.1. Змінні: CaretCreated – змінна типу bool, що визначає створення курсору; CaretPosition – змінна типу CPoint (точка), що визначає позицію курсору в клієнтській області вікна; x, y – змінні, що визначають позицію миші. Інціалізація змінних виконана в конструкторі класу CCaretsView.

2.2. Доповнені наступні функції: OnChar() (відгук на натискання клавіші ON_WM_CHAR); OnLButtonDown() (відгук на натискання лівої клавіші миші ON_WM_LBUTTONDOWN). Змінено функцію OnDraw().

2.2.1. Функція OnChar (відгук на натискання клавіші ON_WM_CHAR).

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

{

CCaretsDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData+=nChar;

Invalidate();

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

}

Код функції аналогічний коду в попередньому прикладі (Блок 4.1).

2.2.2. Функція OnDraw().

void CCaretsView::OnDraw(CDC* pDC)

{

CCaretsDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if(!CaretCreated)

{

TEXTMETRIC textmetric;

pDC->GetTextMetrics(&textmetric);

CreateSolidCaret(textmetric.tmAveCharWidth/8,

textmetric.tmHeight);

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();

}

Ця функція підключається при введенні чергового символу в змінну StringData. Спочатку, коли ще не використовується миша та змінна CaretCreated дорівнює false, виконується створення курсору. У цьому блоці перші дві функції (GetTextMetrics(), CreateSolidCaret()) визначають геометричні параметри курсору. Ширина курсору дорівнює 1/8 ширини символу, а висота дорівнює висоті символу. Ці параметри залишаються постійними і, щоб вдруге не потрапити у розглянутий блок, змінній CaretCreated присвоюється значення true.

Потім виводиться рядок StringData, а після його виведення встановлюється положення курсору. Для цього не показується попередній курсор (HideCaret()) та виводиться новий курсор у кінець рядка (SetCaretPos(CaretPosition)), після чого показується на екрані (ShowCaret()).

2.2.3. Функция OnLButtonDown().

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

{

x = point.x;

y = point.y;

CCaretsDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData.Empty();

Invalidate();

CView::OnLButtonDown(nFlags, point);

}

Ця функція викликається натисканням лівої кнопки миші. При цьому визначаються координати початку виведення рядка StringData і цей рядок очищається. Після цього викликається Invalidate() і у функції OnDraw() встановлюється курсор без тексту для введення чергового рядка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]