- •1А. Побудова проекту додатка без майстра.
- •1Б. Побудова windows-додаткa за допомогою майстра
- •2. Розробка windows-додатку з діалоговим вікном
- •3.Програмування простих арифметичних виразів
- •Завдання до лабораторної роботи:
- •4.Створення файлів даних
- •Void cMyAppView::OnDraw(cdc* pDc)
- •Використання постійних наборів даних. Серіалізація
- •6.Робота з клавіатурою та мишою.
- •Void cLab6View::OnChar(uint nChar, uint nRepCnt, uint nFlags)
- •Void cLab6View::OnChar(uint nChar, uint nRepCnt, uint nFlags)
- •Void cLab6View::OnDraw(cdc* pDc)
- •Void cCenteredView::OnDraw(cdc* pDc)
- •Void cLab6View::OnDraw(cdc* pDc)
- •Void cLab6View::OnDraw(cdc* pDc)
- •If(!CaretCreated)
- •Void cLab6View::OnKillFocus(cWnd* pNewWnd)
- •Void cLab6View::OnSetFocus(cWnd* pOldWnd)
- •7.Обробка текстових даних.
- •Void cTextView::OnDraw(cdc* pDc)
- •8.Обробка одномірних масивів.
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •9. Обробка двомірних масивів.
- •Void cMasView::OnDraw(cdc* pDc)
- •Void cMasView::OnDraw(cdc* pDc)
- •10. Функції. Перевантаження та шаблони функцій.
- •Додаток1.Пояснення архітектури документ/облік
- •Додаток2.Аналіз коду, створеного майстром у lab4
- •MainFrm.H и MainFrm.Cpp
- •Lab4View.H та lab4View.Cpp
- •Список літератури
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 та додайте до нього код для відображення курсора при отриманні фокуса:
