InvalidateRect (hwnd, &rect, false) ;
}
else MessageBeep (0) ;
return 0 ;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
…
-
Коли програма MOUSE одержує повідомлення WM_PAINT, вона перемальовує всю робочу область, малюючи прямокутники за допомогою функції GDI Rectangle. Якщо встановлено значення fState, то програма MOUSE за допомогою функцій MoveTo і LineTo малює дві лінії. Перед перемальовуванням, при обробці повідомлення WM_PAINT, програма не перевіряє, чи дійсна кожна прямокутна область, хоча могла б це робити. Перший метод такої перевірки полягає в створенні усередині циклу структури RECT для кожного прямокутного блоку (з використанням тих же формул, що і для повідомлення WM_LBUTTONDOWN) і перевірки, за допомогою функції IntersectRect, чи перетинається він з недійсним прямокутником (ps.rcPaint). Іншим методом може бути використання функції PtInRect для визначення того, чи знаходиться кожний з чотирьох кутів прямокутного блоку усередині недійсного прямокутника.
#include <windows.h>
#define DIVISIONS 5
#define MoveTo(hdc, x, y) MoveToEx (hdc, x, y, NULL)
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
…
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
…
else
MessageBeep (0) ;
return 0 ;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
for (x = 0 ; x < DIVISIONS ; x++)
for (y = 0 ; y < DIVISIONS ; y++)
{
Rectangle (hdc, x * cxBlock, y * cyBlock,
(x + 1) * cxBlock, (y + 1) * cyBlock) ;
If (fState [X][y])
{
MoveTo (hdc, x * cxBlock, y * cyBlock) ;
LineTo (hdc, (x+1) * cxBlock, (y+1) * cyBlock) ;
MoveTo (hdc, x * cxBlock, (y+1) * cyBlock) ;
LineTo (hdc, (x+1) * cxBlock, y * cyBlock) ;
}
}
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}
Програма готова. Запустите її на виконання.
Практична частина
-
Напишіть програму mouse, описану в лабораторній роботі.
-
Створіть програму, при виконанні якої в робочій області з'являється сплайн Безьє. Сплайн Безьє малюється наступною функцією:
PolyBezier(hdc, pt, iCount),
де pt - масив структур типу POINT, що містить координати крапок, по яких малюється сплайн;
iCount – кількість крапок, у даному випадку 4.
При переміщенні миші з натиснутою лівою кнопкою змінюються відповідно координати початкової крапки. При переміщенні миші з натиснутою правою кнопкою змінюються відповідно координати кінцевої крапки.
Зовнішній вигляд програми повинний бути приблизно наступного виду:
-
— початкова крапка;
-
- (3) — перша і друга контрольні крапки;
(4) — кінцева крапка.
Контрольні питання:
-
Як можна визначити наявність миші і її характеристики?
-
Чим є курсор миші, що таке вершина курсору миші?
-
Де додаток звичайний визначає форму і вид, що здобуває курсор, коли він знаходиться над поверхнею вікна?
-
Які повідомлення можуть надходити до додатку при роботі користувача з мишею?
-
Від чого залежить кількість повідомлень WM_MOUSEMOVE, що одержує вікно додатка?
-
Чи обов'язково додаток, що одержав повідомлення WM_LBUTTONDOWN, одержить і повідомлень WM_LBUTTONUP? У яких випадках це буде обов'язково, а в яких ні?
-
Що необхідно зробити, щоб вікно додатка одержувало повідомлення про подвійні щелчкі миші? Що буде відбуватися в противному випадку?
-
Коли додаток одержує повідомлення миші, зв'язані з неробочою областю вікна?
-
У чому полягає процес захоплення миші вікном? Що при цьому відбувається?