消息处理模块化
WM_DEVICECHANGE
WM_DEVICECHANGE是一个消息,当设备或媒体被添加到或从系统中删除时发送给窗口过程函数。这条消息由Windows操作系统发送,以通知应用程序有关硬件设备状态的变化,例如USB驱动器、CD-ROM驱动器和网络适配器等。
WM_DEVICECHANGE消息包含有关已添加或删除的设备或媒体的信息,包括其类型、GUID和发生的事件类型(例如到达或删除)。应用程序可以使用此信息执行操作,例如更新用户界面或根据设备状态的更改采取某些操作。
为了接收WM_DEVICECHANGE消息,应用程序必须具有带有消息循环的窗口,该窗口已注册以接收设备通知。这可以使用RegisterDeviceNotification函数完成,该函数允许应用程序注册以接收特定类型的设备或媒体的通知。
代码实现:
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
if (pHdr != NULL)
{
switch (pHdr->dbch_devicetype)
{
case DBT_DEVTYP_DEVICEINTERFACE:
PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
if (pDevInf->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE)
{
if (wParam == DBT_DEVICEARRIVAL)
{
std::cout << "USB device inserted" << std::endl;
}
else if (wParam == DBT_DEVICEREMOVECOMPLETE)
{
std::cout << "USB device removed" << std::endl;
}
}
break;
}
}
需要包含:#include <dbt.h> #include <initguid.h> #include <devguid.h>
等头文件
PDEV_BROADCAST_DEVICEINTERFACE:
PDEV_BROADCAST_DEVICEINTERFACE 是一个结构体指针,用于在 WM_DEVICECHANGE 消息中接收有关设备接口的信息。它是 DEV_BROADCAST_DEVICEINTERFACE 结构体的指针类型。 DEV_BROADCAST_DEVICEINTERFACE 结构体定义了有关设备接口的信息,例如接口 GUID 和设备接口名称。
当你接收到 WM_DEVICECHANGE 消息并检查其 wParam 参数时,如果该参数等于 DBT_DEVICEARRIVAL 或 DBT_DEVICEREMOVECOMPLETE,则可以使用 lParam 参数来获取 PDEV_BROADCAST_DEVICEINTERFACE 指针。然后,你可以根据该指针中的信息来确定插入或拔出的设备接口,并执行相应的操作。
GUID_DEVINTERFACE_USB_DEVICE
GUID_DEVINTERFACE_USB_DEVICE 是一个表示 USB 设备接口的 GUID(全局唯一标识符),GUID 可以唯一地标识一个特定的设备类别或接口。
在 Windows 操作系统中,GUID 通常用于标识设备驱动程序、设备接口、COM 组件等。对于 USB 设备来说,GUID_DEVINTERFACE_USB_DEVICE 用于表示 USB 设备接口。
在编写设备管理相关的 Windows 应用程序时,需要使用该 GUID 来注册设备接口通知、枚举 USB 设备等操作。
创建菜单消息模块–WM_CREATE
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
// 处理窗口创建事件
break;
// 其他消息处理代码
}
}
- 增加菜单: AppendMenu
AppendMenu (hSystemMenu , MF_STRING , 1000 , L"1");
MF_STRING:
是Windows编程中使用的一个常量,它代表“菜单项字符串”(Menu Item as String)。它是菜单项中的一个标志,表示菜单项应该显示为文本字符串,而不是图像或图标。当一个菜单项设置了MF_STRING标志时,系统将使用应用程序提供的字符串作为菜单项的标签。这通常用于为命令提供描述性标签。
MF_SEPARATOR
是Windows编程中使用的一个常量,它代表“菜单项分隔符”(Menu Item Separator)。它是菜单中的一个特殊标记,用于在菜单中插入分隔符线。分隔符线通常用于将菜单项分组,以帮助用户更清晰地理解菜单的结构和功能。当一个菜单项设置了MF_SEPARATOR标志时,系统将在该菜单项前插入一条分隔符线。
- 删除菜单:DeleteMenu
BOOL DeleteMenu(
HMENU hMenu, // 菜单句柄
UINT uPosition, // 要删除的菜单项的位置
UINT uFlags // 标志
);
DeleteMenu(hSubMenu, IDM_EXIT, MF_BYCOMMAND);
#include <Windows.h>
// 定义菜单项ID
#define IDM_EXIT 100
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
// 创建菜单项
HMENU hMenu = CreateMenu();
HMENU hSubMenu = CreatePopupMenu();
AppendMenu(hSubMenu, MF_STRING, IDM_EXIT, L"Exit");
AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hSubMenu, L"File");
SetMenu(hWnd, hMenu);
break;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDM_EXIT:
{
// 处理菜单项
MessageBox(hWnd, L"Goodbye!", L"Exit", MB_OK);
break;
}
}
break;
}
case WM_DESTROY:
{
// 销毁菜单项
HMENU hMenu = GetMenu(hWnd);
HMENU hSubMenu = GetSubMenu(hMenu, 0);
DeleteMenu(hSubMenu, IDM_EXIT, MF_BYCOMMAND);
DestroyMenu(hMenu);
PostQuitMessage(0);
break;
}
default:
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
return 0;
}
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
// 注册窗口类
const wchar_t CLASS_NAME[] = L"My Window Class";
WNDCLASS wc = {};
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
// 创建窗口
HWND hWnd = CreateWindowEx(0, CLASS_NAME, L"Hello, World!", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);
if (hWnd == NULL)
{
return 0;
}
// 显示窗口
ShowWindow(hWnd, nCmdShow);
// 进入消息循环
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
GUI绘图—WM_PRINT
WM_PRINT是Windows消息之一,表示请求将指定窗口的客户区或整个窗口的图像打印到指定的设备上下文(DC)中。WM_PRINT消息通常用于实现窗口截图、打印预览和自定义绘图等功能。该消息需要通过SendMessage函数发送,并且可以指定打印方式、输出格式和打印参数等信息。
WM_PRINT消息的常用参数如下:
wParam:表示指定打印方式,可以为PRF_CLIENT、PRF_CHILDREN、PRF_ERASEBKGND、PRF_NONCLIENT、PRF_OWNED等常量的组合。
lParam:表示指定输出格式和打印参数,可以为输出设备的句柄、输出区域的矩形区域、打印参数的指针等。
画笔–CreatePen
CreatePen是Windows API中的一个函数,用于创建一个逻辑笔对象。该对象可以在设备上下文中绘制直线和曲线,例如窗口或位图。
HPEN CreatePen(
int iStyle,
int cWidth,
COLORREF crColor
);
其中:
iStyle指定笔的样式,可以是以下值之一:
PS_SOLID:创建一个实线笔。
PS_DASH:创建一个虚线笔。
PS_DOT:创建一个点线笔。
PS_DASHDOT:创建一个交替虚线和点线的笔。
PS_DASHDOTDOT:创建一个交替虚线和双点线的笔。
cWidth指定笔的宽度,以逻辑单位为单位。
crColor指定笔的颜色,作为COLORREF值。
该函数返回一个句柄,指向逻辑笔对象,该对象可以在设备上下文中使用。
//自制画笔
HPEN hSolidPen = CreatePen(PS_SOLID , 1 , RGB(0,0,255));
HPEN hDashDotPen = CreatePen(PS_DASHDOT , 1, RGB(0,0,255));
//画笔交给画家
HGDIOBJ hOldPen = SelectObject(hdc,hSolidPen);
//从焦点位置画线
LineTo(hdc,200,200);
// 还原旧画笔并删除自制画笔
SelectObject(hdc, hOldPen);
DeleteObject(hSolidPen);
DeleteObject(hDashDotPen);
效果图
画刷
CreateSolidBrush 是 WinAPI(Windows 应用程序编程接口)中的一个函数,用于创建具有指定颜色的新实心画刷。该函数的语法如下:
HBRUSH CreateSolidBrush(
COLORREF color
);
函数接受一个参数 color,它是一个 COLORREF 值,用于指定画刷的 RGB 颜色。返回值是一个句柄,指向新创建的画刷,该句柄可用于填充区域或设备上下文。
CreateHatchBrush 是 WinAPI(Windows 应用程序编程接口)中的一个函数,用于创建具有指定样式和颜色的新阴影画刷。该函数的语法如下:
HBRUSH CreateHatchBrush(
int style,
COLORREF color
);
函数接受两个参数:style 用于指定阴影的样式,它是一个整数值;color 用于指定阴影的颜色,它是一个 COLORREF 值。返回值是一个句柄,指向新创建的画刷,该句柄可用于填充区域或设备上下文。
HBRUSH hSolidBrush = CreateSolidBrush(RGB(255,0,0));
HBRUSh hHatchBrush1 = CreateHatchBrush(HS_CROSS,RGB(0,255,0));
SelectObject(hdc,hSolidBrush);
//插入一个矩形
Rectangle(hdc,300,100,600,200);
效果图