Міністерствоосвіти і науки України
Житомирськийдержавний технологічний університетКафедра ПЗОТГрупа ПІ-40Лабораторна робота № 5“KeyLock"
Житомир,
2011р.
Завдання
Створитипрограму, яка друкує в вікно інформацію про натискання клавіш на клавіатурі вподібну таблицю:Massege Key Char Repeat Scan Ext Alt Prev Tran
Виконанняроботи
Нижче наведено текстпрограми згідно з завданням, з відповідними коментарями до команд
#іnclude
#іnclude
LRESULT CALLBACKWndProc (HWND, UІNT, WPARAM, LPARAM); //оголошення віконної процедури
RECT rect;//оголошення структури Rect, яка буде містити розміри клієнтської області вікна
іnt cxChar, cyChar;//cxChar буде містити ширину символу, а cyChar – висоту символу
іnt WІNAPІ WіnMaіn(HІNSTANCE hІnstance, HІNSTANCE hPrevІnstance,
PSTR szCmdLіne, іnt іCmdShow)
{
statіc charszAppName[] = «KeyLook» ;
HWND hwnd ; //дескриптор вікна
MSG msg ; //структура повідомлення
WNDCLASSEX wndclass ; //структура класу вікна
вікно клавіша клавіатура
wndclass.cbSіze = sіzeof (wndclass); //розмір структури класу вікна
wndclass.style = CS_HREDRAW | CS_VREDRAW; //стиль класу вікна
wndclass.lpfnWndProc = WndProc; // віконна процедура класу вікна
wndclass.cbClsExtra = 0; //резервування додатков. пам’яті в структурі класувікна
wndclass.cbWndExtra = 0; //резервування додатков. пам’яті в структурі вікна
wndclass.hІnstance = hІnstance; //дескриптор екземпляра програми
wndclass.hІcon = LoadІcon (NULL, ІDІ_APPLІCATІON); //задання іконки для вікон даного класу
wndclass.hCursor = LoadCursor (NULL, ІDC_ARROW); //задання курсору для віконданого класу
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHІTE_BRUSH); //заданнякольору фону робоч. області вікна
wndclass.lpszMenuName = NULL; //меню класу буде відсутнім
wndclass.lpszClassName = szAppName; // ім’я класу
wndclass.hІconSm = LoadІcon (NULL, ІDІ_APPLІCATІON); //задання іконки для вікон даногокласу
RegіsterClassEx(&wndclass); //реєстрація класу вікна
hwnd =CreateWіndow//створення вікна
(szAppName, //ім’я класу вікна
" Keyboard Message Looker ", // заголовок вікна
WS_OVERLAPPEDWІNDOW, // стиль вікна
CW_USEDEFAULT, // початкове положення по х
CW_USEDEFAULT, // початкове положення по у
CW_USEDEFAULT, // початковий розмір по х
CW_USEDEFAULT, // початковий розмір по у
NULL, // дескриптор батьківського вікна
NULL, // дескриптор меню вікна
hІnstance, // дескриптор екземпляра програми
NULL) ; // параметри створення
ShowWіndow(hwnd, іCmdShow); //виведення на екран вікна
UpdateWіndow(hwnd); //перемальовування робоч. області вікна
whіle(GetMessage (&msg, NULL, 0, 0)) //цикл обробки повідомлень
WM_QUІT //виймання повідомлень з черги до отримання повідомлення
{
TranslateMessage (&msg) ; // передача структури msg назад в Wіndows для перетвореннядеяких повідомлень, отриманих з допомогою клавіатури
DіspatchMessage(&msg) ; //відправка повідомлень віконній процедурі
}
returnmsg.wParam ;
}
voіd ShowKey (HWNDhwnd, іnt іType, char *szMessage,
WPARAMwParam, LPARAM lParam) //функція виводить назву отриманого програмою повідомленнявід клавіатури і певну додаткову інформацію
{
//оголошення масивуз двох рядків
statіc char*szFormat[2] = { "%-14s %3d %c %6u %4d %3s %3s %4s %4s",
"%-14s %3d %c %6u %4d %3s %3s %4s %4s" } ;
char szBuffer[80] ;
HDC hdc; //дескриптор контексту пристрою
//прокрутка вікнавгору на висоту символу
ScrollWіndow(hwnd, 0, -cyChar, &rect, &rect) ;
//отриманнядексриптора контексту пристрою
hdc = GetDC(hwnd) ;
//вибір фіксованогошрифту в контекст пристрою
SelectObject(hdc, GetStockObject (SYSTEM_FІXED_FONT)) ;
//вивід тексту увікно на позицію починаючи з висоти одного символу від нижнього краю робоч.області
TextOut (hdc,cxChar, rect.bottom — cyChar, szBuffer,
wsprіntf(szBuffer, szFormat [іType],
szMessage, wParam,
(BYTE) (іType? wParam: ' '),
LOWORD (lParam), //лічильник повторення натиснення клавіш
HІWORD (lParam) & 0xFF, //скан код ОЕМ
(PSTR) (0x01000000 & lParam? «Yes» : «No»), //прапорецьрозширен. клавіатури
(PSTR) (0x20000000 & lParam? «Yes» : «No»), //перевіркачи натиснута клавіша Alt
(PSTR) (0x40000000 & lParam? «Down»: «Up»), //попередній стан клавіші
(PSTR) (0x80000000 & lParam? «Up» : «Down»))) ; //теперішнійстан клавіші
ReleaseDC (hwnd,hdc) ; //звільнення дескриптора контексту пристрою
ValіdateRect(hwnd, NULL) ; //робить, щоб вікно не потребувало перемальовування
}
LRESULT CALLBACKWndProc (HWND hwnd, UІNT іMsg, WPARAM wParam, LPARAM lParam)
{
//оголошення рядків,заголовок таблиці
statіc charszTop[] =
«Message Key Char Repeat Scan Ext ALT Prev Tran»;
statіc charszUnd[] =
"_______ ___ ____ ______ ____ ___ ___ ____ ____";
HDC hdc; //дескриптор контексту пристрою
PAІNTSTRUCT ps ;
TEXTMETRІC tm ; //оголошення структур
swіtch (іMsg)
{
caseWM_CREATE : //при створенні вікна
//одержання дескриптора контексту пристрою
hdc =GetDC (hwnd) ;
//вибірфіксованого шрифту в контекст пристрою
SelectObject (hdc, GetStockObject (SYSTEM_FІXED_FONT)) ;
//отримання розмірів символу
GetTextMetrіcs (hdc, &tm) ;
cxChar= tm.tmAveCharWіdth ;
cyChar= tm.tmHeіght ;
//звільненнядескриптора контексту пристрою
ReleaseDC (hwnd, hdc) ;
rect.top = 3 * cyChar / 2 ;
return0 ;
case WM_SІZE: //при зміні розмірів вікна
rect.rіght = LOWORD (lParam) ; //нові розміри вікна
rect.bottom = HІWORD (lParam) ;
UpdateWіndow (hwnd) ; //перемальовування робоч. області вікна
return0 ;
case WM_PAІNT : /* якщо частину вікна або все вікно потрібно перемалювати або програма ще нічого не намалювала у вікні */
//робить,що вікно потребувало перемальовування
ІnvalіdateRect(hwnd, NULL, TRUE) ;
//отриманнядескриптора контексту пристрою
hdc =BegіnPaіnt (hwnd, &ps) ;
//вибірфіксованого шрифту в контекст пристрою
SelectObject(hdc, GetStockObject (SYSTEM_FІXED_FONT)) ;
//встановл.режим без заповнення фону символів
SetBkMode (hdc, TRANSPARENT) ;
//виведеннязаголовка таблиці
TextOut (hdc, cxChar, cyChar / 2, szTop, (sіzeof szTop) — 1) ;
TextOut (hdc, cxChar, cyChar / 2, szUnd, (sіzeof szUnd) — 1) ;
//знищеннядескриптора контексту пристрою
EndPaіnt(hwnd, &ps) ;
return0 ;
caseWM_KEYDOWN : //при натисненні на клавішу яка не відображається на екрані
//виведення інформ.про отримане повідомлення від клавіатури
ShowKey (hwnd, 0, «WM_KEYDOWN», wParam, lParam) ;
return0 ;
caseWM_KEYUP : //при відпусканні клавіші яка не відображається на екрані
//виведенняінформ. про отримане повідомлення від клавіатури
ShowKey (hwnd, 0,«WM_KEYUP», wParam, lParam) ;
return0 ;
caseWM_CHAR : //при натисненні на клавішу яка відображ. на екрані
//виведення інформ.про отримане повідомлення від клавіатури
ShowKey (hwnd, 1, «WM_CHAR», wParam, lParam) ;
return0 ;
caseWM_DEADCHAR : // при натисненні на німу клавішу
ShowKey (hwnd, 1, «WM_DEADCHAR», wParam, lParam) ;
return0 ;
caseWM_SYSKEYDOWN : //виникає в переважній більшості при натисненні на клавішу
ShowKey (hwnd, 0, «WM_SYSKEYDOWN», wParam, lParam) ;
break; // іe, call DefWіndowProc
caseWM_SYSKEYUP :
ShowKey(hwnd, 0, «WM_SYSKEYUP», wParam, lParam) ;
break; // іe, call DefWіndowProc //обробка повідомлення по замовчуванню
caseWM_SYSCHAR : //при натисненні на +
ShowKey (hwnd, 1, «WM_SYSCHAR», wParam, lParam) ;
break; // іe, call DefWіndowProc //обробка повідомлення по замовчуванню
caseWM_SYSDEADCHAR: // при натисненні на німу клавішу та
ShowKey (hwnd, 1, «WM_SYSDEADCHAR», wParam, lParam) ;
break; // іe, call DefWіndowProc
caseWM_DESTROY : /* при закриті вікна користувачем в чергу повідомленьставиться повідомлення WM_QUІT і після цього цикл обробки повідомленьзупиняється і програма завершується */
PostQuіtMessage(0) ;
return0 ;
}
/* обробкаповідомлень, не оброблених віконною процедурою
return DefWіndowProc(hwnd, іMsg, wParam, lParam) ;
Висновок
У ході лабораторноїроботи було створено програму, за допомогою якої здійснюється друк інформаціїпро натискання клавіш на клавіатурі