- •О.С. Зеленський
- •Розділ 1. Загальні відомості створення додатку windows
- •1.1. Створення додатку Windows за допомогою майстра AppWizard
- •1.2. Варіанти майстрів для різних проектів
- •1.3. Короткий опис sdi програми
- •1.4. Короткий опис mdi програми
- •1.5. Короткий опис простого діалогового додатку
- •Контрольні питання
- •Розділ 2. Повідомлення і команди
- •2.1. Обробка повідомлень
- •2.2. Цикли обробки повідомлень
- •2.3. Карти повідомлень
- •Контрольні питання
- •Розділ 3. Документи та види
- •3.1. Клас додатку
- •3.2. Клас головного вікна
- •3.3. Клас документа
- •3.4. Класи виду
- •Контрольні питання
- •Розділ 4. Робота з клавіатурою, мишею і меню
- •4.1. Робота з клавіатурою
- •4.2. Робота з мишею
- •4.3. Робота з меню
- •Контрольні питання
- •Розділ 5. Виведення на екран
- •5.1. Класи графічних об'єктів
- •5.2. Робота зі шрифтами
- •5.3. Робота з пензликами та малювання графічних фігур
- •5.4. Робота з пензликом
- •5.5. Робота зі скролінгом
- •5.6. Приклад роботи з таблицями
- •5.7. Малювання на екрані маніпулятором "миша"
- •5.8. Завантаження та виведення на екран бітових зображень
- •5.9. Копіювання бітових образів
- •5.10. Малювання графічних об'єктів з використанням резинових контурів та метафайлів
- •5.11. Виділення графічних об'єктів у прямокутній області
- •5.12. Універсальний приклад роботи з двовимірною графікою з використанням резинового контуру
- •5.13. Запис на диск та зчитування з диску графічних об'єктів
- •5.14. Побудова кругових діаграм і гістограм
- •5.15. Користувацький режим роботи з графікою на прикладі малювання годинника Clock
- •Контрольні питання
- •Завдання
- •Розділ 6. Друк і попередній перегляд документів
- •6.1. Вибір і налаштування параметрів друку
- •6.2. Створення контекста пристрою
- •6.3. Друк документів і бібліотека mfc
- •6.4. Масштабування
- •6.5. Друк багатосторінкового документа
- •Контрольні питання
- •Розділ 7. Робота з файлами
- •7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream
- •7.1.1. Робота з класом cFile
- •7.1.2. Робота з потоком fstream
- •Можливі режими доступу
- •7.1.3. Робота з класом cStdioFile
- •7.2. Серіалізація даних, клас cArchive
- •7.3. Використання реєстру в додатках
- •Контрольні питання
- •Завдання
- •Розділ 8. Діалогові вікна
- •8.1. Створення діалогового вікна та простіші елементи керування
- •8.2. Робота зі списками і комбінованими полями
- •8.3. Ускладнений приклад зі списками
- •8.4. Робота з повзунками
- •8.5. Виведення бітових матриць в діалозі та у вікні виду
- •8.6. Лінійний регулятор, лінійний індикатор, інкриментний регулятор
- •8.7. Стандартні діалоги вибору файлів, шрифтів та кольору
- •8.8. Взаємоз'вязок діалога, документа та виду при розробці додатку
- •8.8.1. Клас cDialDoc
- •8.8.2. Клас cDialView
- •8.8.3. Клас Cdlg
- •8.9. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
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() встановлюється курсор без тексту для введення чергового рядка.