百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

win32编程 -- 消息机制(一) win32消息处理函数

liebian365 2024-10-22 15:42 24 浏览 0 评论

你多少岁不重要,看起来像几岁才重要,不要把辛苦和怨气都挂在脸上,你想要最好的生活,就先让生活看到最好的你。。。。

---- 网易云热评


一、程序执行机制

1、过程驱动 - 程序的执行过程是按照预定好的顺序执行。

2、事件驱动 - 程序的执行是无序,用户可以根据需要随机触发相应的事件。

3、Win32窗口程序就是采用 事件驱动 方式执行,也就是 消息机制。

4、当系统通知窗口工作时,就采用消息的方式派发给窗口。


二、消息组成(windows平台下)

窗口句柄

消息ID 0-1023

消息的两个参数(两个附带信息)

消息产生的时间

消息产生时的鼠标位置


三、窗口处理函数和消息

1、每个窗口都必须具有窗口处理函数。

LRESULT CALLBACK WindowProc(
       HWND hwnd,           //窗口句柄
       UINT uMsg,           //消息ID
       WPARAM wParam,       //消息参数
       LPARAM lParam               //消息参数
);

2、当系统通知窗口时,会调用窗口处理函数同时,将消息ID和消息参数传递给窗口处理函数。

3、在窗口处理函数中,不处理的消息,使用默认窗口处理函数,例如DefWindowProc。


四、消息相关函数

1、GetMessage - 获取消息

BOOL GetMessage(
       LPMSG lpMsg,  //存放获取到的消息BUFF
       HWND hWnd,           //接收窗口句柄,如果是空,所有消息都管
       UINT wMsgFilterMin,//获取消息的最小ID  0,如果是0,所有消息id都管
       UINT wMsgFilterMax  //获取消息的最大ID 0
);

lpMsg - 当获取到消息后,将消息的参数存放到MSG结构中。

hWnd - 获取到hWnd所指定窗口的消息。

wMsgFilterMin和wMsgFilterMax -只能获取到由它们指定的消息范围内的消息,如果都为0,表示没有范围。

2、TranslateMessage - 翻译消息。将按键消息,翻译成字符消息。

BOOL TranslateMessage(
       CONST MSG* lpMsg     //要翻译的消息地址
)

检查消息是否是按键的消息,如果不是按键消息,不做任何处理,继续执行。

3、DispatchMessage - 派发消息。将消息派发到该消息所属窗口的窗口处理函数上

LRESULT DispatchMessage(
       CONST MSG* lpmsg     //要派发的消息
);


五、windows常用消息

1、WM_DESTROY:窗口被销毁时的消息,无消息参数。常用于在窗口被销毁之前,做相应的善后处理,例如资源、内存等。

2、WM_SYSCOMMAND:系统命令消息,当点击窗口的最大化、最小化、关闭等命令时,收到这个消息。常用在窗口关闭时,提示用户处理。

wParam:具体点击的位置,例如关闭SC_CLOSE等.

lParam:鼠标位置

LOWORD:低字,水平位置

HIWORD:高字,垂直位置

3、WM_CREATE:在窗口创建成功还未显示之前,收到这个消息。常用于初始化窗口的参数、资源等等,包括创建子窗口等。

WPARAM:不使用,LPARAM:是CREATESTRUCT结构的指针,保存了CreatWindowEx中的12个参数。

4、WM_SIZE:在窗口的大小发生变化后,会收到WM_SIZE。常用于窗口大小变化后,调整窗口内各个部分的布局。

WPARAM:窗口大小变化的原因。

LPARAM:变化窗口客户区的大小

LOWORD:变化后的宽度

HIWORD:变化后的高度

5、WM_QUIT:用于结束消息循环处理。

wParam:PostQuitMessage 函数传递的参数。

lParam:不使用,当GetMessage收到这个消息后,会返回FALSE, 结束while处理,退出消息循环。

6、WM_PAINT:绘图消息 键盘消息 鼠标消息 定时器消息

7、相关代码

HINSTANCE g_hInstance = 0;//接收当前程序实例句柄
HANDLE g_接受句柄 = 0;//接收标准输出句柄
HWND g_编辑框句柄 = 0;
//窗口创建前所做的事情
void 创建前(HWND hWnd, LPARAM lParam)
{
       CREATESTRUCT* pcs = (CREATESTRUCT*)lParam;
       char* str = (char*)pcs->lpCreateParams;
       MessageBox(hWnd,(LPCWSTR)str , L"哎呦", MB_OK);
       
}
//DOS窗口
void DOS窗口(HWND hWnd, LPARAM lParam)
{
       int DOS高 = LOWORD(lParam);
       int DOS宽 = HIWORD(lParam);
       MoveWindow(g_编辑框句柄, 0, 0, DOS宽, DOS高, TRUE);//移动窗口,控件随窗口变化
       wchar_t szText[256] = {};
       
       swprintf_s(szText, L"宽:%d,高:%d\n", DOS宽, DOS高);
       WriteConsole(g_接受句柄,szText, wcslen(szText)  ,NULL,NULL);
}
//窗口上摆放编辑框
void 摆放控件(HWND hWnd)
{
       g_编辑框句柄= CreateWindowEx(0,L"EDIT",L"",WS_CHILD|WS_VISIBLE|WS_BORDER,
              0,0,500,500,hWnd,NULL,g_hInstance,NULL);
       
}
//2、消息处理函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID,
       WPARAM wParam, LPARAM lParam)
{
       //7、处理消息
       switch (msgID)
       {
       case WM_SIZE:
              DOS窗口(hWnd,lParam);
              break;
       case WM_CREATE:
              创建前(hWnd,lParam);
              摆放控件(hWnd);
              break;
       case WM_SYSCOMMAND:
              //MessageBox(hWnd,L"哎呦",L"不错哦",MB_OK);
              if (wParam==SC_CLOSE)
              {
                     BOOL res= MessageBox(hWnd, L"要关闭么?", L"不错哦",  MB_YESNO);
                     if (res==IDYES)
                     {
                           //不用写,自动处理
                     }
                     else
                     {
                           return 0;
                     }
              }
              break;
       case WM_DESTROY:
              PostQuitMessage(0);//销毁窗口
              break;
       }
       return DefWindowProc(hWnd, msgID, wParam, lParam);
}
//3、注册函数,第一个参数,窗口类名称,第二个参数,指向窗口处理函数的函数指针
void Register(LPSTR lpClassName, WNDPROC winProc)
{
       WNDCLASSEX wc = { 0 };
       wc.cbSize = sizeof(wc);//结构体大小
       wc.cbClsExtra = 0;//窗口类的申请缓存区,0表示不开启缓存
       wc.cbWndExtra = 0;//窗口的申请缓存区,0表示不开启缓存
       wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);//背景颜色,一般白色
       wc.hCursor = NULL;//设置光标。null表示默认
       wc.hIcon = NULL;//默认左上角的图标
       wc.hInstance = g_hInstance;//第一个参数实例句柄,可以找到进程在那块内存
       wc.lpfnWndProc = winProc; //lp 一般都是指针,处理函数名或指针
       wc.lpszClassName = (LPCWSTR)lpClassName;//窗口类名称,比如公司名字
       wc.lpszMenuName = NULL;//没有菜单用null
       wc.style = CS_HREDRAW | CS_VREDRAW;//窗口变化,会重绘,窗口类的一般风格
       RegisterClassEx(&wc);
}
//4、创建窗口,(窗口类名称,窗口标题栏名称)
HWND CreateMain(LPCWSTR lpClassName, LPCWSTR lpWindowName)
{
       HWND hWnd = CreateWindowExW(0, lpClassName, lpWindowName,  WS_OVERLAPPEDWINDOW,
              100, 100, 500, 500, NULL, NULL, g_hInstance, (LPVOID)L"附加数据");
       return hWnd;
}
//5、显示窗口(窗口句柄)
void Display(HWND hWnd)
{
       ShowWindow(hWnd, SW_SHOW);//句柄,显示方式
       UpdateWindow(hWnd);//调用一次刷新窗口
}
//6、消息循环
void Message()
{
       MSG nMsg = { 0 };
       while (GetMessage(&nMsg, nullptr, 0, 0))
       {
              TranslateMessage(&nMsg);
              DispatchMessage(&nMsg);
       }
}
//1、入口函数
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevIns, LPSTR lpCmdLine, int   nCmdShow)
{
       g_hInstance = hInstance;
       
       AllocConsole();//增加一个dos窗口
       g_接受句柄 = GetStdHandle(STD_OUTPUT_HANDLE);
       
       Register(LPSTR(L"主"), WndProc);
       HWND hWnd = CreateMain(LPCWSTR(L"主"), LPCWSTR(L"主窗口"));
       Display(hWnd);
       Message();
       return 0;
}

8、运行结果


欢迎关注公众号:顺便编点程

??

?

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: