Міністерствоосвіти і науки України
Житомирськийдержавний технологічний університет
Лабораторнаробота №6
з курсу«Системне програмування»
на тему: «Миша»
м. Житомир
2011р.
Зміст
Завдання. 3
Хід роботи. 4
1. Виведення координат миші у вікні. 4
2. Відстань між двома точками у вікні. 4
Програмний код. 5
Висновок. 10
Завдання
1. Вивестикоординати миші у вікні
2. Знайти відстань між двома точками увікні
3. Знайти швидкість руху миші напроміжку
Хідроботи
Для виконанняцієї лабораторної роботи, було опрацьовано теоретичний матеріал поданий вдодатках до лабораторної роботи.1. Виведеннякоординат миші у вікні
Для того щобвизначити координати миші, необхідно обробити повідомлення WM_MOUSEMOVE, якеприходить кожний раз, коли виконується рух миші при активному вікні, в рамкахвікна. Параметрами цього повідомлення є координати миші.
Обробляючи цеповідомлення, ми формуємо текстовий рядок наступним чином:
X = LOWORD(lParam);
Y =HIWORD(lParam);
wsprintf(str, “X = %d Y = %d “, x,y );2. Відстаньміж двома точками у вікні
Необхіднозафіксувати дві точки. Нехай це будуть точки в яких користувач натисне ліву апотім праву кнопку миші.
Коли виконуєтьсянатискання лівої або правої кнопки миші, ми отримуємо повідомлення:
WM_LBUTTONDOWNабо WM_RBUTTONDOWN
Разом з цимиповідомленнями передаються координати миші.
X =LOWORD(lParam);
Y =HIWORD(lParam);
Це координати вяких було виконане натискання.
Нехай лівакнопка миші була натиснута в координатах (X1,Y1) а права в координатах (X2,Y2).Відстань між двома точками отримуємо за виразом:
S = sqrt( ( X2 — X1 ) * ( X2 — X1 ) + ( Y2 — Y1 ) * ( Y2 — Y1 ) );
Для визначенняшвидкості руху миші потрібно знати час руху на проміжку.
Для визначеннячасу, потрібно зафіксувати час при натисканні лівої кнопки миші, а потім часпри натисканні правої кнопки миші.
T1 = clock(); //цей рядок пишемо в обробник повідомлення WM_LBUTTONDOWN
…
T2 = clock(); //цей рядок пишемо в обробник WM_RBUTTONDOWN
DT = T2 – T1;
Speed = S / DT
Теперзалишається тільки вивести значення в вікно.
Для виведенняотриманих текстових рядків можна використати функцію TextOut(). Вона вигіднатим, що дозволяє виводити в визначені координати вікна. координата курсор миша переміщення
Виведенняотриманих рядків необхідно робити тільки в обробці повідомлення WM_PAINT. Воноприходить тоді, коти операційна система вважає, що інформація в нашому вікнізастаріла.
Якщо, нампотрібно згенерувати повідомлення WM_PAINT, то викликаємо функціюInvalidateRect(), яка повідомляє ОС про те що якась частина нашого вікна (абовсе вікно) застаріло. Виклик цієї функції ми робимо кожний раз, коли необхідноперемалювати вікно.Програмнийкод
#include
#include
#include
#include
LRESULTCALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
intcX, cY, sX,sY;
doublespeed;
doubleT1 = 0, T2 = 0;
doubleS = 0;
intwayOnTable;
intWINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTRszCmdLine, int iCmdShow)
{
staticTCHAR szAppName[] = _T(«HelloWin») ;
HWNDhwnd ;
MSGmsg ;
WNDCLASSEXwndclass ;
wndclass.cbSize= sizeof (wndclass) ;
wndclass.style= CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc= WndProc ;
wndclass.cbClsExtra= 0 ;
wndclass.cbWndExtra= 0 ;
wndclass.hInstance= hInstance ;
wndclass.hIcon= LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor= LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName= NULL ;
wndclass.lpszClassName= szAppName ;
wndclass.hIconSm= LoadIcon (NULL, IDI_APPLICATION) ;
RegisterClassEx(&wndclass) ;
hwnd= CreateWindow (szAppName, // window class name
_T(«TheHello Program»), // window caption
WS_OVERLAPPEDWINDOW,// window style
CW_USEDEFAULT,// initial x position
CW_USEDEFAULT,// initial y position
CW_USEDEFAULT,// initial x size
CW_USEDEFAULT,// initial y size
NULL,// parent window handle
NULL,// window menu handle
hInstance,// program instance handle
NULL); // creation parameters
ShowWindow(hwnd, iCmdShow) ;
while(GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage(&msg) ;
DispatchMessage(&msg) ;
}
returnmsg.wParam ;
}
LRESULTCALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDChdc ;
PAINTSTRUCTps ;
RECTrect ;
RECTrectInv;
intx, y;
rectInv.top= 0;
rectInv.left= 0;
rectInv.right= 400;
rectInv.bottom= 60;
switch(iMsg)
{
caseWM_CREATE :
return0 ;
caseWM_MOUSEMOVE:
cX= LOWORD(lParam);
cY= HIWORD(lParam);
InvalidateRect(hwnd,&rectInv, true);
return0;
caseWM_LBUTTONDOWN:
sX= LOWORD(lParam);
sY= HIWORD(lParam);
T1= clock();
S= 0;
speed= 0;
wayOnTable= 0;
return0;
caseWM_RBUTTONDOWN:
x= LOWORD(lParam);
y= HIWORD(lParam);
S= sqrt((double)(( x — sX ) * ( x — sX ) + ( y — sY ) * ( y — sY)));
T2= clock();
speed= (S / max(0.01, (T2 — T1))/ CLOCKS_PER_SEC);
wayOnTable= S / 25 ;
InvalidateRect(hwnd,&rectInv, true);
return0;
caseWM_PAINT :
TCHARstr[40];
TCHARway[45];
TCHARway2[45];
_stprintf(str,_T(” X = %d Y = %d “), cX, cY );
_stprintf(way,_T(«Миша пройшла %d пікселів зі шв. %lf»), (int)S, speed);
_stprintf(way2,_T(«Миша пройшла %d мм по столу»), wayOnTable);
hdc= BeginPaint (hwnd, &ps) ;
GetClientRect(hwnd, &rect) ;
TextOut(hdc,5, 5, str, _tcslen(str));
TextOut(hdc,5, 25, way, _tcslen(way));
TextOut(hdc,5, 45, way2, _tcslen(way2));
EndPaint(hwnd, &ps) ;
return0 ;
caseWM_DESTROY :
PostQuitMessage(0) ;
return0 ;
}
returnDefWindowProc (hwnd, iMsg, wParam, lParam) ;
}
Висновок
Отже, привиконанні даної лабораторної роботи були здобуті навики обробки миші у вікні. Врезультаті, програма здатна виводити координати курсору миші при переміщенні, атакож відображати відстань та швидкість з якою проходить курсор між двомаобраними точками.