My First Window构造过程,SendMessage同步,PostMessage异步
文章目录
- 第一步:定义你的窗口是什么样的?(创建,初始化,注册窗口类)
- 第二步:创建并显示窗口
- 第三步:接收消息并处理(处理的话也就是完成回调函数初始化)
- 举例:
- 默认的消息处理函数:
- SendMessage同步
- PostMessage异步
- 窗口完整代码
- 运行截图
第一步:定义你的窗口是什么样的?(创建,初始化,注册窗口类)
窗口的类名:
PSTR classname = (PSTR)"My First Window";
创建窗口类的对象:
WNDCLASS wndclass = { 0 }; //一定要将所有值赋值wndclass.hbrBackground = (HBRUSH)COLOR_MENU;//窗口背景色wndclass.lpfnWndProc = WindowProc;//窗口过程函数(注册回调函数)wndclass.lpszClassName = classname;//窗口类的名字wndclass.hInstance = hInstance;//定义窗口类 的应用程序的实例句柄//注册窗口类
//参见MSDN文档RegisterClass-->Parameters
//You must fill the structure with appropriate class attributes
//before passing it to the functionRegisterClass(&wndclass);
第二步:创建并显示窗口
HWND hwnd = CreateWindow(classname,//类名"我的第一个窗口",//窗口标题WS_OVERLAPPEDWINDOW,//窗口外观样式10,//相对于父窗口的x坐标10,//相对于父窗口的y坐标800,//窗口的宽度400,//窗口的高度NULL,//父窗口句柄NULL,//菜单句柄hInstance,//当前应用程序句柄NULL);//附加数据,一般为MULL//显示窗口ShowWindow(hwnd, SW_SHOW);
第三步:接收消息并处理(处理的话也就是完成回调函数初始化)
MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}
回调函数初始化:
LRESULT CALLBACK WindowProc(IN HWND hwnd,IN UINT uMsg,IN WPARAM wParan,IN LPARAM lParam
) {//获取dialog句柄TCHAR szBuff[0x20];GetClassName(hwnd, szBuff, 0x20);WNDCLASS wc;GetClassInfo(hAppInstance, szBuff, &wc);//PDWORD addr=(PDWORD)wc.IpfnWndProc;DWORD addr = GetWindowLong(hwnd, GWL_WNDPROC);DWORD error = GetLastError();//获取线程IDDWORD dwThreadId = GetCurrentThreadId();switch (uMsg){case WM_DESTROY:{PostQuitMessage(0);return 0;}case 0x401:{strcpy_s(szBuff, "接到其它程序发送的消息!!!");MessageBox(hwnd, szBuff, "--", MB_OK);return 0;}/*case WM_KEYDOWN:{sprintf_s(szBuff, "你按下了%d键", wParan);MessageBox(hwnd, szBuff, "---", 0);return 0;}*/case WM_CHAR:sprintf_s(szBuff, "你按下了%c键", wParan);MessageBox(hwnd, szBuff, "---", 0);return 0;default:break;}return DefWindowProc(hwnd, uMsg, wParan, lParam);
}
前面已经解释过,这个DispatchMessage(&msg);
和GetMessage(&msg, NULL, 0, 0)
,这里就来解释一下TranslateMessage(&msg);,
这个API主要针对WM_CHAR
这个键盘消息的,
TranslateMessage(&msg);
处理键盘消息(WM_CHAR),这个消息进行字符转换的,(把键盘上的65转换为字符a,仅此而已,也就对键盘消息进行键盘消息加工作用
举例:
保留着TranslateMessage(&msg);
接收消息用代码
case WM_CHAR:sprintf_s(szBuff, "你按下了%c键", wParan);MessageBox(hwnd, szBuff, "---", 0);return 0;
运行截图如下:
注释掉TranslateMessage(&msg);
接收消息用代码
case WM_CHAR:sprintf_s(szBuff, "你按下了%c键", wParan);MessageBox(hwnd, szBuff, "---", 0);return 0;
运行截图如下,没反应,是因为回调函数没有接收到消息吗?那接下来我们来验证一下
注释掉TranslateMessage(&msg);
接收消息用代码
case WM_KEYDOWN:{sprintf_s(szBuff, "你按下了%d键", wParan);MessageBox(hwnd, szBuff, "---", 0);return 0;
运行截图如下:
好了,现在大家心里都清楚了吧
默认的消息处理函数:
DefWindowProc(hwnd, uMsg, wParan, lParam);
对其它我们不需要关注的消息进行处理
SendMessage同步
当我们未点击确定时,发送消息的程序未退出,需要点击确定后,发送消息的程序收到返回消息,它才会自行退出。这也就是SendMessage的同步问题
PostMessage异步
PostMessage
发送完消息后,程序即刻退出,并不会等待处理结果,这也就是PostMessage
发送消息异步问题
窗口完整代码
#include "framework.h"
#include "窗口过程.h"
#include<stdio.h>
HINSTANCE hAppInstance;
#define MAX_LOADSTRING 100LRESULT CALLBACK WindowProc(IN HWND hwnd,IN UINT uMsg,IN WPARAM wParan,IN LPARAM lParam
);
void CreateButton(HWND hwnd);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR IpCmdLine,int nCmdShow) {//把这个参数变为全局的,下面的函数会用到hAppInstance = hInstance;//窗口的类名PSTR classname = (PSTR)"My First Window";//创建窗口类的对象WNDCLASS wndclass = { 0 }; //一定要将所有值赋值wndclass.hbrBackground = (HBRUSH)COLOR_MENU;//窗口背景色wndclass.hCursor = LoadCursor(NULL, IDC_APPSTARTING);wndclass.lpfnWndProc = WindowProc;//窗口过程函数wndclass.lpszClassName = classname;//窗口类的名字wndclass.hInstance = hInstance;//定义窗口类的应用程序的实例句柄//注册窗口类//参见MSDN文档RegisterClass-->Parameters//You must fill the structure with appropriate class attributes//before passing it to the functionRegisterClass(&wndclass);//创建窗口HWND hwnd = CreateWindow(classname,//类名"我的第一个窗口",//窗口标题WS_OVERLAPPEDWINDOW,//窗口外观样式10,//相对于父窗口的x坐标10,//相对于父窗口的y坐标800,//窗口的宽度400,//窗口的高度NULL,//父窗口句柄NULL,//菜单句柄hInstance,//当前应用程序句柄NULL);//附加数据,一般为MULLif (hwnd == NULL) {OutputDebugString("输出错误");}//显示窗口ShowWindow(hwnd, SW_SHOW);MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {//TranslateMessage(&msg);//DispatchMessage(&msg);}return 0;}
LRESULT CALLBACK WindowProc(IN HWND hwnd,IN UINT uMsg,IN WPARAM wParan,IN LPARAM lParam
) {//获取dialog句柄TCHAR szBuff[0x20];GetClassName(hwnd, szBuff, 0x20);WNDCLASS wc;GetClassInfo(hAppInstance, szBuff, &wc);//PDWORD addr=(PDWORD)wc.IpfnWndProc;DWORD addr = GetWindowLong(hwnd, GWL_WNDPROC);DWORD error = GetLastError();//获取线程IDDWORD dwThreadId = GetCurrentThreadId();switch (uMsg){case WM_DESTROY:{PostQuitMessage(0);return 0;}case 0x401:{strcpy_s(szBuff, "接到其它程序发送的消息!!!");MessageBox(hwnd, szBuff, "--", MB_OK);return 0;}case WM_KEYDOWN:{sprintf_s(szBuff, "你按下了%d,%d键", wParan, lParam);MessageBox(hwnd, szBuff, "---", 0);return 0;}/*case WM_CHAR:sprintf_s(szBuff, "你按下了%c键", wParan);MessageBox(hwnd, szBuff, "---", 0);return 0;*/default:break;}return DefWindowProc(hwnd, uMsg, wParan, lParam);
}
运行截图
My First Window构造过程,SendMessage同步,PostMessage异步相关推荐
- Window SendMessage,PostMessage分析
Window SendMessage,PostMessage分析 背景 SendMessage 函数原型 PostMessage 函数原型 区别 问题解决 背景 前段时间程序中突然出现一个Bug,程序 ...
- sendmessage和postmessage的区别
1.POSTMESSAGE(非阻塞)与SENDMESSAGE(阻塞) 区别1:返回时间不同 PostMessage发送消息后就立即返回 SendMessage发送消息后,等待消息处理函数处理完后才返回 ...
- SendMessage 和 PostMessage
Win32 API消息函数:SendMessage 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程 序处理完消息再返回.而函数PostMessage不同, ...
- SendMessage、PostMessage原理
SendMessage.PostMessage原理 本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别 ...
- SendMessage和PostMessage
SendMessage 和 PostMessage 的区别 1.首先是返回值意义的区别,我们先看一下 MSDN 里的声明: LRESULT SendMessage( HWND hWnd ...
- SendMessage、PostMessage原理和源代码详解
本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别为: 1.SendMessage.PostMessa ...
- SendMessage、PostMessage 2021-01-07
本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别为: 1.SendMessage.PostMessa ...
- 第三章 软件构造过程与配置管理
第三章 软件构造过程与配置管理 第三章 软件构造过程与配置管理 Software Development Lifecycle(SDLC)软件开发生命周期 From 0 to 1 从无到有 From 1 ...
- BigInteger类实例的构造过程——JDK源码解析
最近看了下JDK1.6版本的BigInteger类,仔细研究了下大整数实例的构造过程,现在把自己的所得所想分享给大家. 首先,为什么需要大整数类?简单的说就是因为内部的数据类型能表示的最大数是64位长 ...
最新文章
- 解题报告(一)B、(CF453D) Little Pony and Elements of Harmony(FWT经典套路 + 任意模数 k 进制FWT + 快速幂)(2)
- Vmware 下安装Arch Linux
- [UOJ62]怎样跑得更快
- 数据流图怎么画_概率图模型怎么画?5个步骤完成专业模型图
- JDBC中的Statement和PreparedStatement的区别
- shell简单的交互式脚本
- 封装el-select(全球国家名字及国家区号),select 输入框回显
- 解决win10 1903 系统盘占用100%造成系统假死
- win10系统电脑提示此程序被组策略阻止的解决办法
- 为什么Java的lambda或匿名内部类中用到的外部局部变量需要声明成final或是effectively final的?
- OTN / SONET / SDH
- 腾讯企业邮箱解析到阿里云域名
- 哪个服务器开了无限火力,国服无限火力已经开放入口?有玩家已经提前卡进无限火力模式...
- 找不到 Microsoft Excel Driver ODBC 驱动程序的安装例程 解决方案
- Proxy ARP--即ARP代理
- 百问网7天物联网记录(二)
- 《数据库系统原理》教学上机实验报告
- mcu 与电量计 BQ40Z80 通信,读取电芯电量
- MySQL 命令环境变量设置方法
- 数据库概论——物理独立性和逻辑独立性
热门文章
- DL之AlexNet:利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型)
- 成功解决你没有权限访问,请与网络管理员联系图文教程
- CV:翻译并解读2019《A Survey of the Recent Architectures of Deep Convolutional Neural Networks》第一章~第三章
- ML之ECS:利用ECS的PAI进行傻瓜式操作机器学习的算法
- 成功解决absl.flags._exceptions.UnrecognizedFlagError: Unknown command line flag 'data_format'
- Graphviz:可视化工具Graphviz的简介、安装、使用方法、经典案例之详细攻略
- 深入浅出统计学 第一章 数据的可视化
- 蓝桥杯_算法训练_关联矩阵
- dedecms织梦修改标题默认长度
- 设计模式之职责链模式永不罢休(二十一)