windows下重要消息队列

消息处理模块化

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);


效果图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我只爱炸鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值