• WinAPI程序消息处理(系统消息)


    WM_QUIT消息
    产生时间:由程序员发送
    附带信息:wParam:PostQuitMessage函数传递的参数
    lParam:0
    一般用法:用于结束循环,当GetMessage收到 这个消息后,会返回FALSE,结束While循环,退出消息循环。

    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    
    • 1
    • 2
    • 3

    WM_DESTROY消息
    产生时间:窗口被销毁时的消息
    附带信息:wParam:为0
    lParam:为0
    一般用法:常用于在窗口被销毁之前,做相应的善后处理,例如资源、内存等。

    WM_CLOSE、WM_DESTROY、WM_QUIT消息区别:
    关闭窗口时,先触发WM_CLOSE,此消息触发DestroyWindow函数,然后产生一个WM_DESTROY消息,然后在WM_DESTROY消息中再触发PostQuitMessage(0)函数,再触发WM_QUIT退出消息循环
    WM_CLOSE:关闭应用程序窗口
    WM_DESTORY:关闭应用程序
    WM_QUIT:关闭消息循环

    WM_SYSCOMMAND消息
    产生时间:当点击窗口的最大化、最小化、关闭等。
    附带信息:wParam:具体点击的位置,例如关闭CS_CLOSE、SC_MINIMIZE、SC_MAXIMIZE等
    lParam:鼠标光标的位置
    LOWORD(lParam)//水平位置
    HIWORD(lParam)//垂直位置
    一般用法:常用在窗口关闭时,提示用户信息

    case WM_SYSCOMMAND:
    		if(wParam == SC_CLOSE) //关闭窗口
    		{
       
    			if(IDNO == MessageBox(hwnd,TEXT("是否退出?\n提示:如果按“是”则直接退出,按“否”点提示鼠标点击位置!"),TEXT("提示:"),MB_YESNO))
    			{
       
    				wsprintf(szstr,"鼠标点击位置为:X=%d,Y=%d\n点击“确定”退出程序!",LOWORD(lParam),HIWORD(lParam));
    				MessageBox(hwnd,szstr,TEXT("按鼠标的位置:"),MB_OK);
    			}
    		}
    		else if(SC_MINIMIZE == wParam) //窗口最小化
    		{
       
    			MessageBox(hwnd,TEXT("点击了最小化按钮!"),TEXT("提示:"),MB_OK);
    		}
    		else if(SC_MAXIMIZE == wParam) //窗口最大化
    		{
       
    			MessageBox(hwnd,TEXT("点击了最大化按钮!"),TEXT("提示:"),MB_OK);
    		}
    		break;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    WM_CREAT:
    产生时间:在窗口创建成功但未显示时。
    附带信息:wParam:为0
    lParam:为CREATESTRUCT类型的指针。
    通过这个指针可以获得CreateWindowEx中的全部12个参数的信息。
    一般用法:常用于初始化窗口的参数、资源等等,包括创建子窗口等。
    以下是3个片段来说明通过lParam参数来取得CREATESTRUCE参数的细节

    //1.创建一个onCreateh函数取得CreateWindowEx的参数
    void OnCreate(HWND hwnd,LPARAM lParam)
    {
       
    	CREATESTRUCT* cst = (CREATESTRUCT*)lParam;
    	TCHAR* szmsg = (TCHAR*)cst->lpCreateParams; //通过这个参数取到CreateWindowEx的参数lpCreateParams
    	MessageBox(NULL,szmsg,TEXT("命令行参数:"),MB_OK);
    	CreateWindowEx(0,"EDIT",TEXT("请输入:"),WS_CHILD|WS_VISIBLE|WS_BORDER,0,0,500,25,hwnd,NULL,NULL,NULL);//创建一个edit的系统子窗口
    }
    //2.创建窗口函数,注意最后一个参数,我们传递的是程序命令行的参数(szinfo参数)
    hwnd = CreateWindowEx(0,
    						  szAppName,
    						  TEXT("Windows API 程序示例"),
    						  WS_OVERLAPPEDWINDOW,
    						  CW_USEDEFAULT,
    						  CW_USEDEFAULT,
    						  CW_USEDEFAULT,
    						  CW_USEDEFAULT,
    						  NULL,
    						  NULL,
    						  hInstance,
    						  szInfo);
    //3.下面是消息处理函数的部分
    case WM_CREATE:
    		PlaySound(szMusicTitle,NULL,SND_FILENAME|SND_ASYNC);
    		OnCreate(hwnd,lParam
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    定时关机软件哪个好?定时关机软件大盘点
    LeetCode 0813. 最大平均值和的分组
    【PingPong_注册安全分析报告】
    shell脚本之数组
    java计算机毕业设计精准扶贫管理系统源码+数据库+系统+lw文档+mybatis+运行部署
    stm32 iap sd卡升级
    作为一名大学生,需要什么?前辈真实经历
    java计算机毕业设计web家教信息服务平台设计与实现源码+mysql数据库+系统+lw文档+部署
    在Linux上安装Percona Toolkit工具
    浅析关河因果“逻辑规则+机器学习”
  • 原文地址:https://blog.csdn.net/weixin_43069562/article/details/127916690