文章目录

  • 第一步:定义你的窗口是什么样的?(创建,初始化,注册窗口类)
  • 第二步:创建并显示窗口
  • 第三步:接收消息并处理(处理的话也就是完成回调函数初始化)
  • 举例:
  • 默认的消息处理函数:
  • 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异步相关推荐

  1. Window SendMessage,PostMessage分析

    Window SendMessage,PostMessage分析 背景 SendMessage 函数原型 PostMessage 函数原型 区别 问题解决 背景 前段时间程序中突然出现一个Bug,程序 ...

  2. sendmessage和postmessage的区别

    1.POSTMESSAGE(非阻塞)与SENDMESSAGE(阻塞) 区别1:返回时间不同 PostMessage发送消息后就立即返回 SendMessage发送消息后,等待消息处理函数处理完后才返回 ...

  3. SendMessage 和 PostMessage

    Win32 API消息函数:SendMessage 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程 序处理完消息再返回.而函数PostMessage不同, ...

  4. SendMessage、PostMessage原理

    SendMessage.PostMessage原理 本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别 ...

  5. SendMessage和PostMessage

    SendMessage 和 PostMessage 的区别 1.首先是返回值意义的区别,我们先看一下 MSDN 里的声明: LRESULT SendMessage(         HWND hWnd ...

  6. SendMessage、PostMessage原理和源代码详解

    本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别为: 1.SendMessage.PostMessa ...

  7. SendMessage、PostMessage 2021-01-07

    本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别为: 1.SendMessage.PostMessa ...

  8. 第三章 软件构造过程与配置管理

    第三章 软件构造过程与配置管理 第三章 软件构造过程与配置管理 Software Development Lifecycle(SDLC)软件开发生命周期 From 0 to 1 从无到有 From 1 ...

  9. BigInteger类实例的构造过程——JDK源码解析

    最近看了下JDK1.6版本的BigInteger类,仔细研究了下大整数实例的构造过程,现在把自己的所得所想分享给大家. 首先,为什么需要大整数类?简单的说就是因为内部的数据类型能表示的最大数是64位长 ...

最新文章

  1. 解题报告(一)B、(CF453D) Little Pony and Elements of Harmony(FWT经典套路 + 任意模数 k 进制FWT + 快速幂)(2)
  2. Vmware 下安装Arch Linux
  3. [UOJ62]怎样跑得更快
  4. 数据流图怎么画_概率图模型怎么画?5个步骤完成专业模型图
  5. JDBC中的Statement和PreparedStatement的区别
  6. shell简单的交互式脚本
  7. 封装el-select(全球国家名字及国家区号),select 输入框回显
  8. 解决win10 1903 系统盘占用100%造成系统假死
  9. win10系统电脑提示此程序被组策略阻止的解决办法
  10. 为什么Java的lambda或匿名内部类中用到的外部局部变量需要声明成final或是effectively final的?
  11. OTN / SONET / SDH
  12. 腾讯企业邮箱解析到阿里云域名
  13. 哪个服务器开了无限火力,国服无限火力已经开放入口?有玩家已经提前卡进无限火力模式...
  14. 找不到 Microsoft Excel Driver ODBC 驱动程序的安装例程 解决方案
  15. Proxy ARP--即ARP代理
  16. 百问网7天物联网记录(二)
  17. 《数据库系统原理》教学上机实验报告
  18. mcu 与电量计 BQ40Z80 通信,读取电芯电量
  19. MySQL 命令环境变量设置方法
  20. 数据库概论——物理独立性和逻辑独立性

热门文章

  1. DL之AlexNet:利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型)
  2. 成功解决你没有权限访问,请与网络管理员联系图文教程
  3. CV:翻译并解读2019《A Survey of the Recent Architectures of Deep Convolutional Neural Networks》第一章~第三章
  4. ML之ECS:利用ECS的PAI进行傻瓜式操作机器学习的算法
  5. 成功解决absl.flags._exceptions.UnrecognizedFlagError: Unknown command line flag 'data_format'
  6. Graphviz:可视化工具Graphviz的简介、安装、使用方法、经典案例之详细攻略
  7. 深入浅出统计学 第一章 数据的可视化
  8. 蓝桥杯_算法训练_关联矩阵
  9. dedecms织梦修改标题默认长度
  10. 设计模式之职责链模式永不罢休(二十一)