win32编程 -- 消息机制(一) win32消息处理函数
liebian365 2024-10-22 15:42 32 浏览 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、运行结果
欢迎关注公众号:顺便编点程
??
?
相关推荐
- “版本末期”了?下周平衡补丁!国服最强5套牌!上分首选
-
明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...
- VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"
-
首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...
- 东营交警实名曝光一批酒驾人员名单 88人受处罚
-
齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...
- Qt界面——搭配QCustomPlot(qt platform)
-
这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...
- 大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写
-
老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...
- 测试谷歌VS Code AI 编程插件 Gemini Code Assist
-
用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...
- 顾爷想知道第4.5期 国服便利性到底需优化啥?
-
前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...
- 掌握Visual Studio项目配置【基础篇】
-
1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...
- 还嫌LED驱动设计套路深?那就来看看这篇文章吧
-
随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...
- Visual Studio Community 2022(VS2022)安装图文方法
-
直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...
- Qt添加MSVC构建套件的方法(qt添加c++11)
-
前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...
- Qt为什么站稳c++GUI的top1(qt c)
-
为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...
- qt开发IDE应该选择VS还是qt creator
-
如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...
- Qt 5.14.2超详细安装教程,不会来打我
-
Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...
- Cygwin配置与使用(四)——VI字体和颜色的配置
-
简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- “版本末期”了?下周平衡补丁!国服最强5套牌!上分首选
- VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"
- 东营交警实名曝光一批酒驾人员名单 88人受处罚
- Qt界面——搭配QCustomPlot(qt platform)
- 大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写
- 测试谷歌VS Code AI 编程插件 Gemini Code Assist
- 顾爷想知道第4.5期 国服便利性到底需优化啥?
- 掌握Visual Studio项目配置【基础篇】
- 还嫌LED驱动设计套路深?那就来看看这篇文章吧
- Visual Studio Community 2022(VS2022)安装图文方法
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)