实验三 基于 SDK 编程(二)
一、实验目的
- 掌握设备驱动程序翻译的常用虚拟码
- 掌握两类键盘消息
二、实验要求
- 预习本次实验的实验要求和任务
- 熟悉基于 SDK 的键盘操作技术和方法,并独立完成本次实验
三、实验环境
- 软件:VC++ 6.0 或 Visual Studio
四、实验内容
- 创建一个键盘操作的 VC 工程,创建 cpp 文件
- 编写 WinMain 函数进行本工程窗口定义与设计等任务,并完成窗口函数中的基本消息处理过程
- 按照要求对"ctrl"键、"shift"键、下左或右箭头、Home 及 End 键、PageUp 及PageDown 键编写相应的消息响应代码,以实现单击这些按钮时,分别可以完成不同图形的绘制以及移动等操作。
五、实验过程及结果描述
- 依照实验一步骤创建一个基于 SDK 的工程及相应其它文件
- 在本工程的 cpp 文件中输入以下代码:
#include<windows.h>
int nMode;
RECT rect;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
WinMain函数如下:
int WINAPI WinMain(HINSTANCE hinstaance, HINSTANCE pre, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wchar_t lpszClassName[] = L" ";
wchar_t Title[] = L"实验三";
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL, IDI_QUESTION);
wndclass.hInstance = hinstaance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = lpszClassName;
wndclass.lpszMenuName = NULL;
wndclass.style = 0;
RegisterClass(&wndclass);
hwnd = CreateWindow(lpszClassName, Title, WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, 100, 100, 500, 500, NULL, NULL, hinstaance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
窗口函数代码如下:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
HPEN hp;
HBRUSH hb;
static int Circle;
PAINTSTRUCT ps;
switch (message)
{
case WM_KEYDOWN:
if (wParam == VK_CONTROL)
{
Circle = 1;
rect.left = 0;
rect.right = 50;
rect.top = 0;
rect.bottom = 50;
InvalidateRect(hwnd, NULL, 1);
}
else if (wParam == VK_HOME)
{
rect.left = rect.left - 10;
rect.right = rect.right - 10;
if (Circle == 1)
{
InvalidateRect(hwnd, NULL, 1);
}
}
else if (wParam == VK_END)
{
rect.left = rect.left + 10;
rect.right = rect.right + 10;
if (Circle == 1)
{
InvalidateRect(hwnd, NULL, 1);
}
}
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
SetMapMode(hdc, MM_ISOTROPIC);
SetWindowExtEx(hdc, 1, 1, NULL);
SetViewportExtEx(hdc, 1, 1, NULL);
hp = CreatePen(PS_SOLID, 0, RGB(0, 0, 255));
hb = CreateSolidBrush(RGB(0, 255, 0));
SelectObject(hdc, hb);
SelectObject(hdc, hp);
if (Circle == 1)
{
Ellipse(hdc, rect.left, rect.top, rect.right, rect.bottom);
}
EndPaint(hwnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hwnd, message, wParam, lParam));
}
return 0;
}
3.在此基础上,添加如下功能:
(1)按下"shift"键时,进行矩形绘制;
(2)按下左或右箭头,矩形或椭圆高度或长度加 10;
(3)按下 PageUp 或 PageDown 时,矩形或椭圆向上或向下移动。
窗口函数添加如下代码:
static int Rec;
case WM_KEYDOWN:
else if (wParam == VK_SHIFT)
{
Rec = 1;
rect.left = 0;
rect.right = 50;
rect.top = 0;
rect.bottom = 50;
InvalidateRect(hwnd, NULL, 1);
}
else if (wParam == VK_UP)
{
rect.top -= 10;
rect.bottom -= 10;
if (Rec == 1) {
InvalidateRect(hwnd, NULL, 1);
}
}
else if (wParam == VK_DOWN)
{
rect.top += 10;
rect.bottom += 10;
if (Rec == 1) {
InvalidateRect(hwnd, NULL, 1);
}
}
else if (wParam == VK_RIGHT)
{
rect.right += 10;
rect.bottom += 10;
if (Circle == 1||Rec == 1)
{
InvalidateRect(hwnd, NULL, 1);
}
}
else if (wParam == VK_LEFT)
{
rect.left -= 10;
rect.bottom += 10;
if (Circle == 1 || Rec == 1)
{
InvalidateRect(hwnd, NULL, 1);
}
}
break;
case WM_PAINT:
if (Rec == 1)
{
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
}