C++运行示范实验代码 1,掌握程序鼠标交互方法,尝试为其添加键盘与菜单控制,实现同样功能
时间: 2023-12-09 08:03:48 浏览: 125
1.鼠标操作演示(Visual C++编程 源代码)
以下是一个简单的C++程序,演示了使用鼠标与键盘进行交互的方法。它创建了一个窗口,其中包含一个可以移动的矩形。您可以使用鼠标左键单击并拖动矩形,或使用方向键来移动它。此外,程序还包括一个简单的菜单,用于选择矩形的颜色。
```c++
#include <windows.h>
#include <iostream>
// 定义窗口句柄和矩形位置
HWND hwnd;
RECT rect = { 50, 50, 150, 150 };
// 定义菜单项ID
#define ID_RED 1
#define ID_GREEN 2
#define ID_BLUE 3
// 处理窗口消息的回调函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
{
// 绘制矩形
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HBRUSH hBrush = CreateSolidBrush(RGB(255, 0, 0));
SelectObject(hdc, hBrush);
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
EndPaint(hWnd, &ps);
break;
}
case WM_LBUTTONDOWN:
{
// 按下鼠标左键时,记录矩形左上角的位置
int x = LOWORD(lParam);
int y = HIWORD(lParam);
if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom)
{
SetCapture(hWnd);
SetCursor(LoadCursor(NULL, IDC_SIZEALL));
}
break;
}
case WM_MOUSEMOVE:
{
// 拖动矩形
if (GetCapture() == hWnd)
{
int x = LOWORD(lParam);
int y = HIWORD(lParam);
int dx = x - rect.left;
int dy = y - rect.top;
rect.left += dx;
rect.right += dx;
rect.top += dy;
rect.bottom += dy;
InvalidateRect(hWnd, NULL, TRUE);
}
break;
}
case WM_LBUTTONUP:
{
// 释放鼠标左键
ReleaseCapture();
SetCursor(LoadCursor(NULL, IDC_ARROW));
break;
}
case WM_KEYDOWN:
{
// 使用方向键移动矩形
switch (wParam)
{
case VK_LEFT:
rect.left -= 10;
rect.right -= 10;
break;
case VK_RIGHT:
rect.left += 10;
rect.right += 10;
break;
case VK_UP:
rect.top -= 10;
rect.bottom -= 10;
break;
case VK_DOWN:
rect.top += 10;
rect.bottom += 10;
break;
}
InvalidateRect(hWnd, NULL, TRUE);
break;
}
case WM_COMMAND:
{
// 处理菜单选择事件
switch (LOWORD(wParam))
{
case ID_RED:
DeleteObject(SelectObject(GetDC(hWnd), CreateSolidBrush(RGB(255, 0, 0))));
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_GREEN:
DeleteObject(SelectObject(GetDC(hWnd), CreateSolidBrush(RGB(0, 255, 0))));
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_BLUE:
DeleteObject(SelectObject(GetDC(hWnd), CreateSolidBrush(RGB(0, 0, 255))));
InvalidateRect(hWnd, NULL, TRUE);
break;
}
break;
}
case WM_DESTROY:
// 退出程序
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// 程序入口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 注册窗口类
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszClassName = L"SampleWindowClass";
RegisterClass(&wc);
// 创建窗口
hwnd = CreateWindow(L"SampleWindowClass", L"Sample Window", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
// 创建菜单
HMENU hMenu = CreateMenu();
HMENU hColorMenu = CreatePopupMenu();
AppendMenu(hColorMenu, MF_STRING, ID_RED, L"Red");
AppendMenu(hColorMenu, MF_STRING, ID_GREEN, L"Green");
AppendMenu(hColorMenu, MF_STRING, ID_BLUE, L"Blue");
AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hColorMenu, L"Color");
// 将菜单关联到窗口
SetMenu(hwnd, hMenu);
// 进入消息循环
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
```
这个程序使用了 Windows API 来创建窗口和处理消息。它的主要逻辑在回调函数 `WndProc` 中实现。在这个函数中,我们处理了一些常见的消息,包括绘制、鼠标事件、键盘事件和菜单事件。其中,`WM_PAINT` 消息用于绘制矩形,`WM_LBUTTONDOWN`、`WM_MOUSEMOVE` 和 `WM_LBUTTONUP` 消息用于响应鼠标事件,`WM_KEYDOWN` 消息用于响应键盘事件,`WM_COMMAND` 消息用于响应菜单事件,`WM_DESTROY` 消息用于退出程序。
为了添加键盘和菜单控制,我们在回调函数中添加了相应的代码。在 `WM_KEYDOWN` 消息处理中,我们检查用户按下的是哪个方向键,并根据需要移动矩形的位置。在 `WM_COMMAND` 消息处理中,我们检查用户选择的是哪个菜单项,并根据需要更改矩形的颜色。
要编译和运行这个程序,您需要使用一个 C++ 编译器和 Windows SDK。您可以使用 Visual Studio 或 MinGW 来编译,也可以使用其他 IDE 或命令行工具。在编译和运行之前,请确保您已经安装了正确的工具和库,并设置了正确的环境变量。
阅读全文