Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_progr_Win / Lab3.doc
Скачиваний:
9
Добавлен:
23.03.2015
Размер:
193.02 Кб
Скачать

InvalidateRect (hwnd, &rect, false) ;

}

else MessageBeep (0) ;

return 0 ;

case WM_PAINT :

hdc = BeginPaint (hwnd, &ps) ;

  1. Коли програма 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) ;

}

Програма готова. Запустите її на виконання.

Практична частина

  1. Напишіть програму mouse, описану в лабораторній роботі.

  1. Створіть програму, при виконанні якої в робочій області з'являється сплайн Безьє. Сплайн Безьє малюється наступною функцією:

PolyBezier(hdc, pt, iCount),

де pt - масив структур типу POINT, що містить координати крапок, по яких малюється сплайн;

iCount – кількість крапок, у даному випадку 4.

При переміщенні миші з натиснутою лівою кнопкою змінюються відповідно координати початкової крапки. При переміщенні миші з натиснутою правою кнопкою змінюються відповідно координати кінцевої крапки.

Зовнішній вигляд програми повинний бути приблизно наступного виду:

  1. — початкова крапка;

  2. - (3) — перша і друга контрольні крапки;

(4) — кінцева крапка.

Контрольні питання:

  1. Як можна визначити наявність миші і її характеристики?

  2. Чим є курсор миші, що таке вершина курсору миші?

  3. Де додаток звичайний визначає форму і вид, що здобуває курсор, коли він знаходиться над поверхнею вікна?

  4. Які повідомлення можуть надходити до додатку при роботі користувача з мишею?

  5. Від чого залежить кількість повідомлень WM_MOUSEMOVE, що одержує вікно додатка?

  6. Чи обов'язково додаток, що одержав повідомлення WM_LBUTTONDOWN, одержить і повідомлень WM_LBUTTONUP? У яких випадках це буде обов'язково, а в яких ні?

  7. Що необхідно зробити, щоб вікно додатка одержувало повідомлення про подвійні щелчкі миші? Що буде відбуватися в противному випадку?

  8. Коли додаток одержує повідомлення миші, зв'язані з неробочою областю вікна?

  9. У чому полягає процес захоплення миші вікном? Що при цьому відбувається?

Соседние файлы в папке Lab_progr_Win