МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Кафедра інформаційних систем та мереж
Лабораторна робота №3
з курсу
«Проблемно-орієнтоване програмування»
на тему:
«Введення даних з клавіатури та миші»
ЛЬВІВ 2016
Мета роботи:
Метою роботи є вивчення способів опрацювання повідомлень від клавіатури і миші для введення даних.
Теоретичні відомості:
Натискання будь-якої клавіші автоматично посилає системі апаратне повідомлення, яке обробляється і надсилається додатком. За цю операцію відповідає повідомлення WM_KEYDOWN.
Його опис складно і на даному етапі не має сенсу, так як ми не включили кирилицю. При посилці цього повідомлення вwParameter записується значення натиснутоюклавіші. Звичайно ж, все залежить від клавіатури, розкладки. Тому все кодів для клавіш багато і ми не будемо описувати, що робити при натисканні тієї чи іншої, а просто виключимо значення не потрібних нам клавіш.
Ми обробляємо повідомлення WM_KEYDOWN (натискання клавіші). Спочатку ми створюємо перемикач switch для значення wParameter, куди записаний ідентифікатор клавіші. Ми виключаємо значення home, кінець, вгору на сторінку, вниз на сторінку, стрілка вліво, стрілка вправо, стрілка вгору, стрілка вниз, видаляти, зрушення, простір, Ctrl, ковпачки блокування, Alt, рахунок, Backspace, enter відповідно. Можливо, на Тобто якщо в ідентифікаторі wParameter у нас ці значення, ми нічого не робимо - оператор break.
А під значеннями default у нас виконується перетворення. Ми створили статичну рядок типу char з 2-х елементів. Статична вона, тому що в процесі роботи програми ми неодноразово виходимо з WindowProcess() в цикл обробки зGetMessage(), розташований в WinMain(), а значення клавіші нам потрібно зберігати. Ми ініціалізіруем її перший елемент wParameter-ом.
Далі викликаємо функцію InvalidateRect(), після чого виходимо з WM_KEYDOWN. Першим параметром йде - дескриптор вікна, другим - область майбутнього «затирання» вікна (NULL - Все вікно перемальовується в WM_PAINT), третім параметром йде «затирання» фону (якщо TRUE, то стираємо). При цьому ми автоматично надсилаємо додатком messageWM_PAINT і вікно перемальовується заново. Для чого це потрібно?
У випадках згортання, переміщення вікна викликається WM_PAINT. Нам же це потрібно зробити явно, тобто зробити вікно недійсним, для того, щоб відразу вивести значення натиснутоюклавіші на екран. Інакше вона з'явиться тільки тоді, коли ми почнемо маніпулювати вікном.
У ній оголошений екземпляр класу HFONT, який відповідає за шрифт, його розмір та інші премудрості. Він буде використовуватися в WM_PAINT.
Є обробник повідомлення WM_CREATE. Він спрацьовує, коли створюється вікно, тобто викликається функціяCreateWindow(). На цьому етапі вирішено створити додаткове вікно з повідомленням для зручності
Варіант №7
Порядок виконання роботи
1. Використовуючи рекомендовані літературні джерела та джерела Internet, вивчити API- функції та повідомлення клавіатури і миші для введення даних, необхідних для роботи програми.
2. Ознайомитися з наведеним у роботі прикладом програми роботи з клавіатурою та мишею.
3. Розробити програму згідно виданого завдання. Номери завдань визначаються як залишок від цілочисельного ділення порядкового номера студента (у впорядкованому за алфавітом повному списку студентів групи) на кількість завдань.
4. Реалізувати програму та отримати результат її роботи.
/
Код програми:
// Win32Project1.cpp: определяет точку входа для приложения.
//
#include "stdafx.h"
#include "Win32Project1.h"
#include "Resource.h"
#define ID_TIMER 1122
#include <windows.h>
#define MAXPOINTS 1000
#define MoveTo(hdc, x, y) MoveToEx(hdc, x, y, NULL)
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//HBRUSH hBrush = HBRUSH(CreateSolidBrush(RGB(255, 235, 205)));
void myString( int& i, HDC hdc);
void DrawFigures(HWND hWnd);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
wchar_t szAppName[] = L"Connect";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
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, L"Connect-the-Points Mouse Demo",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HPEN hOldP, hNewP;
HBRUSH hOldB, hNewB;
static POINT points[MAXPOINTS];
static int iCount;
static int d = 0;
static int h = 0;
static BOOL ff= TRUE;
static int cxClient, cyClient;
//static HPEN hPen=CreatePen(1,10,RGB(255, 235, 205));
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
int R = 3;
HDC hdc;
PAINTSTRUCT ps;
int i, j;
switch(iMsg)
{
case WM_SIZE :
cyClient = HIWORD(lParam);
cxClient=LOWORD(lParam);
return 0;
case WM_LBUTTONDOWN :
if(LOWORD(lParam)>1 && LOWORD(lParam)<1100 && HIWORD(lParam)<20)
{
SetTimer(hwnd, ID_TIMER, 100, NULL);
ff = TRUE;
}
else if(LOWORD(lParam)>350 && LOWORD(lParam)<700 && HIWORD(lParam)>200 && HIWORD(lParam)<350)
{
PostMessage(hwnd, WM_QUIT, 0, 0);
}
case WM_TIMER:
if (wParam == ID_TIMER)
{
if(ff == TRUE)
{
d += 1;
InvalidateRect(hwnd, NULL, TRUE);
}
}
break;
return 0;
case WM_LBUTTONUP :
InvalidateRect(hwnd, NULL, FALSE);
return 0;
case WM_PAINT :
RECT r;
hdc = BeginPaint(hwnd, &ps);
myString( d,hdc);
//hdc = BeginPaint(hwnd, &ps);
hNewP = CreatePen(PS_SOLID, 1, RGB(0, 112, 255));
hNewB = CreateSolidBrush(RGB(0, 112, 255));
hOldP = (HPEN)SelectObject(hdc, hNewP);
hOldB = (HBRUSH)SelectObject(hdc, hNewB);
Rectangle(hdc, 350, 200, 700, 350);
SelectObject(hdc, hOldP);
SelectObject(hdc, hOldB);
TextOut(hdc, 515, 268, L"Вихід", 5);
EndPaint(hwnd, &ps);
return 0;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_EXIT: DestroyWindow(hwnd); break;
default: return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
}
case WM_DESTROY :
PostQuitMessage(0);
return 0;
case WM_RBUTTONDOWN :
if(LOWORD(lParam)>1 && LOWORD(lParam)<1100 && HIWORD(lParam)<20)
ff = FALSE;
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
void myString(int& i, HDC hdc)
{
TextOut(hdc, i,4 , L"io o o o o p p p p poi", 22);
i += 1;
if (i > 1100)
i = 0;
}
void DrawFigures(HWND hWnd)
{
HDC hdc;
PAINTSTRUCT ps;
RECT r;
HPEN hPen;
hdc=BeginPaint(hWnd, &ps);
//Draw rectangle
SetRect(&r,150, 230, 450, 350);
ValidateRect(hWnd, NULL);
EndPaint(hWnd, &ps);
}
Результат роботи:
/
/
Висновок:
Я навчився опрацьовувати повідомлення з клавіатури та миші. Також здобув навички з виводу на екран простих геометричних фігур різного кольору.