MFC学习记录——补充消息处理

本文介绍了MFC中利用消息映射机制处理消息的方法,包括鼠标左键点击、键盘输入和窗口绘画的模拟。通过示例代码展示了如何处理WM_LBUTTONDOWN、WM_KEYDOWN和WM_PAINT消息,分别对应鼠标左键按下、键盘按键和窗口重绘事件。
摘要由CSDN通过智能技术生成

        上节写到了 处理消息 本文将对此部分进行完善。

目录

2.6 消息处理

 3.总结

4.代码


2.6 消息处理

        MFC本质就是使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射表,以及消息处理函数的声明和实现等代码。消息处理部分就是根据消息类型给出相应的处理方法。

        在本文,将着重模拟三类消息的处理:一是对鼠标左键的处理、二是对键盘的处理、三是对绘画的模拟。具体函数实现如下:

1)对鼠标左键处理


    switch(uMsg)
    {
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);//接收消息==false 退出进程
        break;
    case WM_LBUTTONDOWN:
    {
        int xPos = LOWORD(IParam);
        int yPos = HIWORD(IParam);
        char buffer[1024];
        wsprintf(buffer,TEXT("x=%d,y=%d"), xPos, yPos);
        MessageBox(hwnd, buffer, TEXT("鼠标左边按下"), MB_OK);
        break;
    }

运行结果如下:

 2)对键盘处理

case WM_KEYDOWN://键盘
    
        MessageBox(hwnd, TEXT("键盘测试"), TEXT("鼠标左边按下"), MB_OK);
        break;

 3)对绘画的处理

 case WM_PAINT://绘画
    {
        //绘图结构体
        PAINTSTRUCT ps;
        HDC hdc= BeginPaint(hwnd, &ps);
        TextOut(hdc, 100, 120, TEXT("HELLO"), strlen("HELLO"));
        EndPaint(hdc, &ps);
        break;
    }
    }

 3.总结

        上节文章和此次文章都是对底层的熟悉与了解,在实际操作中可以直接使用已经写好的框架。

4.代码

#include<Windows.h>


LRESULT  CALLBACK WindowProc(
    HWND hwnd,//消息所在窗口句柄
    UINT uMsg,//具体消息名称
    WPARAM wParam,//键盘附加消息
    LPARAM IParam//鼠标附加消息
)
{
    switch(uMsg)
    {
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);//接收消息==false 退出进程
        break;
    case WM_LBUTTONDOWN:
    {
        int xPos = LOWORD(IParam);
        int yPos = HIWORD(IParam);
        char buffer[1024];
        wsprintf(buffer,TEXT("x=%d,y=%d"), xPos, yPos);
        MessageBox(hwnd, buffer, TEXT("鼠标左边按下"), MB_OK);
        break;
    }
    case WM_KEYDOWN://键盘
    
        MessageBox(hwnd, TEXT("键盘测试"), TEXT("鼠标左边按下"), MB_OK);
        break;

    case WM_PAINT://绘画
    {
        //绘图结构体
        PAINTSTRUCT ps;
        HDC hdc= BeginPaint(hwnd, &ps);
        TextOut(hdc, 100, 120, TEXT("HELLO"), strlen("HELLO"));
        EndPaint(hdc, &ps);
        break;
    }
    }


    return DefWindowProc(hwnd, uMsg, wParam, IParam);
}
//程序入口函数

int WINAPI WinMain(
    _In_ HINSTANCE hInstance,//应用程序实际句柄  唯一标识
    _In_opt_ HINSTANCE hPrevInstance,//上一个应用程序句柄  一般为NULL 不起作用
    _In_ LPSTR lpCmdLine,//char *argv[]
    _In_ int nShowCmd//显示命令 最大化 最小化 正常
)
{
    hInstance;
    //1.设计窗口
    //2.注册窗口
    //3.创建窗口
    //4.显示和更新
    //5.循环接收消息
    //6.处理消息

     //1.设计窗口
    WNDCLASS wc;
    wc.cbClsExtra = 0;//类的额外内存
    wc.cbWndExtra = 0;//窗口额外内存
    wc.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH);//设置背景  使用API  
    /*  使用白色背景刷子 */
    wc.hCursor = LoadCursor(NULL,IDC_HAND);//设置光标  如果第一个参数为NULL 采用系统默认光标
    wc.hIcon = LoadIcon(NULL,IDC_HELP);//图标
    wc.hInstance = hInstance;//应用程序句柄 传入WIndows中的形参即可
    wc.lpfnWndProc = WindowProc;//回调函数  窗口过程  函数名代表地址
    wc.lpszClassName = TEXT("WINDOWS");//窗口名称
    wc.lpszMenuName = NULL;//菜单
    wc.style = 0;//显示风格


    //2.注册窗口
    RegisterClass(&wc);
    //3.创建窗口
    /*
    IpszClassName 姓名
    IpClassName 类名
    dwSytyle ws_OVERLAPPEDW
    */
    
   HWND hwnd= CreateWindow(wc.lpszClassName, TEXT("WINDOWS"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    
   //4.显示和更新
   ShowWindow(hwnd, SW_SHOWNORMAL);
   UpdateWindow(hwnd);
   //5.循环接收消息

   /*   
    HWND hwmd; 主窗口句柄
    UINT message;具体消息名称
    WPARAIL wParam;附加消息、键盘消息  
    LPARAIL iParam;附加消息鼠标消息
    DWORD time;消息产生时间
    POINT pt;附加消息  鼠标消息 xy

*/
   MSG msg;
   while (1) {
       /*
    _Out_LPMSG lpMsg,消息
    _In_opt_HIND HIAnd,捕获窗口 填NULL代表捕获所有的窗口
    _In_UINT willsgFilterWin,//最小和最大的过滤的消息、一般填入0
    _In_UINT wMsgFilterMax)//填0代表捕获所有消息
*/
       if (GetMessage(&msg, NULL, 0, 0) ==FALSE )
       {
           break;//退出
       }
       //不为false 分发消息
       TranslateMessage(&msg);//翻译消息
       DispatchMessage(&msg);//分发消息

    }

   //6.处理窗口
 
    return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值