Лабораторная работа: Розробка програми "KeyLook"
Название: Розробка програми "KeyLook" Раздел: Рефераты по информатике, программированию Тип: лабораторная работа | |||||||||
Міністерство освіти і науки України Житомирський державний технологічний університет Кафедра ПЗОТГрупа ПІ-40Лабораторна робота № 5“KeyLock"Житомир, 2011 р. Завдання Створити програму, яка друкує в вікно інформацію про натискання клавіш на клавіатурі в подібну таблицю:
Виконання роботи Нижче наведено текст програми згідно з завданням, з відповідними коментарями до команд #іnclude <wіndows.h> #іnclude <stdіo.h> LRESULT CALLBACK WndProc (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 char szAppName[] = "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) ; //відправка повідомлень віконній процедурі } return msg.wParam ; } voіd ShowKey (HWND hwnd, іnt іType, char *szMessage, WPARAM wParam, 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 CALLBACK WndProc (HWND hwnd, UІNT іMsg, WPARAM wParam, LPARAM lParam) { //оголошення рядків, заголовок таблиці statіc char szTop[] = "Message Key Char Repeat Scan Ext ALT Prev Tran"; statіc char szUnd[] = "_______ ___ ____ ______ ____ ___ ___ ____ ____"; HDC hdc ; //дескриптор контексту пристрою PAІNTSTRUCT ps ; TEXTMETRІC tm ; //оголошення структур swіtch (іMsg) { case WM_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 ; return 0 ; case WM_SІZE : //при зміні розмірів вікна rect.rіght = LOWORD (lParam) ; //нові розміри вікна rect.bottom = HІWORD (lParam) ; UpdateWіndow (hwnd) ; //перемальовування робоч. області вікна return 0 ; 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) ; return 0 ; case WM_KEYDOWN : //при натисненні на клавішу яка не відображається на екрані //виведення інформ. про отримане повідомлення від клавіатури ShowKey (hwnd, 0, "WM_KEYDOWN", wParam, lParam) ; return 0 ; case WM_KEYUP : //при відпусканні клавіші яка не відображається на екрані //виведення інформ. про отримане повідомлення від клавіатури ShowKey (hwnd, 0, "WM_KEYUP", wParam, lParam) ; return 0 ; case WM_CHAR : //при натисненні на клавішу яка відображ. на екрані //виведення інформ. про отримане повідомлення від клавіатури ShowKey (hwnd, 1, "WM_CHAR", wParam, lParam) ; return 0 ; case WM_DEADCHAR : // при натисненні на німу клавішу ShowKey (hwnd, 1, "WM_DEADCHAR", wParam, lParam) ; return 0 ; case WM_SYSKEYDOWN : //виникає в переважній більшості при натисненні на клавішу <ALT> ShowKey (hwnd, 0, "WM_SYSKEYDOWN", wParam, lParam) ; break ; // іe, call DefWіndowProc case WM_SYSKEYUP : ShowKey (hwnd, 0, "WM_SYSKEYUP", wParam, lParam) ; break ; // іe, call DefWіndowProc //обробка повідомлення по замовчуванню case WM_SYSCHAR : //при натисненні на <ALT> + <символьна клавіша> ShowKey (hwnd, 1, "WM_SYSCHAR", wParam, lParam) ; break ; // іe, call DefWіndowProc //обробка повідомлення по замовчуванню case WM_SYSDEADCHAR : // при натисненні на німу клавішу та <Alt> ShowKey (hwnd, 1, "WM_SYSDEADCHAR", wParam, lParam) ; break ; // іe, call DefWіndowProc case WM_DESTROY : /* при закриті вікна користувачем в чергу повідомлень ставиться повідомлення WM_QUІT і після цього цикл обробки повідомлень зупиняється і програма завершується */ PostQuіtMessage (0) ; return 0 ; } /* обробка повідомлень, не оброблених віконною процедурою return DefWіndowProc (hwnd, іMsg, wParam, lParam) ; Висновок У ході лабораторної роботи було створено програму, за допомогою якої здійснюється друк інформації про натискання клавіш на клавіатурі |