day02 创建第一个Windows窗口及Windows的消息处理

文章目录

  • 第一个Windows窗口程序
    • 1. 入口函数
    • 2. 创建窗口类
    • 3. 注册窗口
    • 4. 创建窗口实例
    • 5. 处理消息事件
    • 6. 回调函数
    • 完整测试
  • Windows消息处理

第一个Windows窗口程序

1. 入口函数

Windows编程的入口函数:
建议直接F1查询官方文档,Ctrl C+V

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdLine,int       nShowCmd
)
{return 0;
}

2. 创建窗口类

我们准备创建一个窗口类,使用WNDCLASSW创建一个支持宽字符的窗口类:
这个类比较复杂,但是我们实际用到的属性不多:
WNDCLASSW函数原型官方文档

WNDCLASSW myClassWindow{ 0 };		
myClassWindow.lpszClassName = L"我的第一个窗口";	//显式指定窗口类名
myClassWindow.lpfnWndProc = nullptr;			//指定回调函数,我们之后会用到,暂时给他赋一个空值

我们创建一个最简单的窗口类,可以只声明这个两个参数的值,但是在我们以后的学习中,你就会慢慢丰富这个类,比如,我们可以指定窗口的图标,鼠标样式等等。。。我们以后再说。

3. 注册窗口

根据我们创建的窗口类,注册一个窗口实例:

RegisterClassW(&myClassWindow);

注册成功后,我们便可以使用这个窗口类创建一个实例对象了。

4. 创建窗口实例

CreatClass创建一个窗口类:

HWND window=CreateWindowW(myClassWindow.lpszClassName,//窗口的类名L"无标题",	//窗口的标题WS_OVERLAPPEDWINDOW,	//窗口样式CW_USEDEFAULT,	//窗口的x坐标(左上角)0,	//窗口的y坐标CW_USEDEFAULT,	//窗口的width宽度0,	//窗口的height高度NULL,	//窗口的父窗口句柄(一般为空)NULL,	//菜单hInstance,	//与此窗口相关联的窗口句柄NULL	//一般为空
);
//显示窗口
ShowWindow(window, SW_SHOWNORMAL);

我们返回一个HWND的句柄,这样我们就得到我们的主窗口的句柄了。
然后再显示此窗口。

5. 处理消息事件

Windows系统是基于消息的操作系统。
每一个窗口都在不停的处理消息,所有的操作都是接收到消息之后,进行处理的结果。
围绕着消息的处理,产生了获取消息的消息泵机制也叫消息循环,以及处理消息的窗口回调函数机制。

消息的产生
Windows下产生消息的时机共有以下四种:
1、用户主动产生的消息
2、Windows系统本身产生的消息。
3、应用程序本身产生的消息。
4、其他应用程序产生的消息。
那么应用程序是如何接受消息的呢?

Windows操作系统有一个系统消息队列,每个GUI程序,都有自己的消息队列,系统消息队列负责将消息发送给不同GUI程序的消息队列。
API函数:
GetMessage 从消息队列中取出消息
TranslateMessage 翻译消息为字符消息
DispatchMessage 将消息发送给消息处理函数。

MSG msg{ 0 };
while (GetMessageW(&msg, 0, 0, 0))
{TranslateMessage(&msg);DispatchMessageW(&msg);
}

6. 回调函数

Wndproc: 在应用程序中定义的回调函数,用于处理发送到窗口的消息。

windows就是一个不断处理消息的系统,我们要对其处理消息,并且返回给主函数。

LRESULT CALLBACK Wndproc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam
)
{switch (uMsg){case WM_CREATE:{MessageBoxW(hwnd, L"窗口创建成功!", L"提示", MB_OK);break;}case WM_CLOSE:{DestroyWindow(hwnd);PostQuitMessage(NULL);break;}}return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}

记得在我们最开始创建的窗口类中指明我们的回调函数:

myClassWindow.lpfnWndProc = Wndproc;

完整测试

#include <Windows.h>LRESULT CALLBACK Wndproc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam
)
{switch (uMsg){case WM_CREATE:{MessageBoxW(hwnd, L"窗口创建成功!", L"提示", MB_OK);break;}case WM_CLOSE:{DestroyWindow(hwnd);PostQuitMessage(NULL);break;}}return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdLine,int       nShowCmd
)
{WNDCLASSW myClassWindow{ 0 };myClassWindow.lpszClassName = L"我的第一个窗口";myClassWindow.lpfnWndProc = Wndproc;RegisterClassW(&myClassWindow);HWND window=CreateWindowW(myClassWindow.lpszClassName,//窗口的类名L"无标题",	//窗口的标题WS_OVERLAPPEDWINDOW,	//窗口样式CW_USEDEFAULT,	//窗口的x坐标(左上角)0,	//窗口的y坐标CW_USEDEFAULT,	//窗口的width宽度0,	//窗口的height高度NULL,	//窗口的父窗口句柄(一般为空)NULL,	//菜单hInstance,	//与此窗口相关联的窗口句柄NULL	//一般为空);//显示窗口ShowWindow(window, SW_SHOWNORMAL);MSG msg{ 0 };while (GetMessageW(&msg, 0, 0, 0)){TranslateMessage(&msg);DispatchMessageW(&msg);}return 0;
}

在这里插入图片描述
在这里插入图片描述


Windows消息处理

Windows通用消息:
Windows通用消息标志都定义在WINUSER.H中,以WM_开头,大体分为三类。

  1. 窗口消息
    例如:WM_CREATEWM_CLOSE

  2. 命令消息
    特指WM_COMMAND消息,与处理用户请求有关,如点击菜单项,工具栏,控件等就会产生命令消息。

  3. 通知消息
    特指WM_NOTIFY消息,只使用用windows的公共控件,如列表,视图等。

  • Windos控件消息
    控件消息是用于控制控件的一些行为的,不同的控件有不同的控制消息,命名规则如下:
    BM_按钮控制消息
    EM_编辑框控制消息
    STM_静态文本控制消息
    CM_组合框控制消息
    LBM_列表框控制消息

  • 用户自定义消息
    除了windows消息外,我们也可以定义自己的消息。系统的消息马在0-WM_USER之间,故而我们定义的消息大于WM_USER即可

  • 消息的发送
    PostMessageSendMessage
    PostMessage会将消息发送到消息队列,应用程序的消息循环会最终得到消息,并分发给回调函数。
    SendMessage相当于直接调用窗口的回调函数,等待窗口过程处理结束并返回结果。
    根据发送消息的方式不同,消息分为两类:
    队列消息、非队列消息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57080.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python导入自己的文件:完全指南

Python导入自己的文件&#xff1a;完全指南 Python是一种高级编程语言&#xff0c;许多工程师在开发过程中使用它。当我们在编写Python应用程序时&#xff0c;可能需要将代码拆分为多个模块&#xff0c;以使其更易于维护和扩展。在这种情况下&#xff0c;我们需要导入自己的Py…

chatgpt赋能python:Python中的库导入方法详解

Python中的库导入方法详解 Python拥有丰富的库&#xff0c;这也是它广受欢迎的原因之一。而在使用Python编程时&#xff0c;如何正确地导入库是至关重要的。本文将介绍Python中常用的库导入方法&#xff0c;并帮助读者理解每种方法的优缺点。 直接导入库 最基本的导入库方法…

Postman下载安装教程

看到很多小伙伴在问 Postman 下载的相关问题&#xff0c;花时间整理了下&#xff0c;下面教新入门的小伙伴如何去下载 Postman。 开始前我们可以先了解下&#xff1a;Postman 简介 下载 第一步&#xff1a;进入 Postman 官网 首先&#xff0c;我们需要进入 Postman 的官网。…

001 用python和tushare获取股票数据

数据获取可以用爬虫&#xff0c;api。api我了解的有tushare和pandas_datareader&#xff0c;用conda或者pip命令安装即可。此处只介绍tushare。 一、 注册 到tushare官网注册&#xff0c;并获取自己的token&#xff08;调用api需要token才可以访问数据&#xff09;。官网链接…

现在学Python还有前途吗?能做什么?

现在学Python还有前途吗&#xff1f;能做什么&#xff1f;无论是从行业人才需求&#xff0c;国家政策支持&#xff0c;还是从Python本身广泛应用的优势来看&#xff0c;学Python都是极其有个人发展前途的。至于可以从事的工作岗位就更多了&#xff0c;像Linux运维、Python Web网…

ChatGPT:2. 使用OpenAI创建自己的AI网站:1. 初探API

使用OpenAI创建自己的AI网站 如果你还是一个OpenAI的小白&#xff0c;有OpenAI的账号&#xff0c;但想调用OpenAI的API搞一些有意思的事&#xff0c;那么这一系列的教程将仔细的为你讲解如何使用OpenAI的API制作属于自己的AI网站。博主只能利用下班时间更新&#xff0c;进度慢…

推荐一个好用的开发工具百宝箱

随着科技不断发展&#xff0c;越来越多的工具在网络上应运而生&#xff0c;方便我们更加高效地完成各种任务。今天我要向大家介绍一款在线工具——码加在线工具 - 做更好的工具&#xff0c;它可以帮助你轻松完成许多繁琐、复杂的工作。 首先&#xff0c;码加在线工具 是一款非…

零代码编程:用ChatGPT打造一个信息推送的微信机器人

很多时候&#xff0c;我们希望监控一些最新信息&#xff0c;能够第一时间在微信上看到。现在有很多这方面的消息推送工具&#xff0c;比如wxpusher、Pushplus、server饭、server酱等&#xff1a; pushplus&#xff1a;免费账号一天限制200条请求数&#xff0c;1分钟内最多接收…

案例:百度的评论系统是怎么设计的?你想象不到

百度评论中台为百度系产品提供便利接入、持续稳定的评论能力&#xff0c;是百度社区氛围体系内最重要的基础能力之一&#xff0c;日均流量达到百亿规模&#xff0c;在业务不断发展过程中&#xff0c;百度评论中台实现了功能快速迭代、性能稳步提升&#xff0c;本文将从整体介绍…

CSDN - 屏蔽无耻的百度广告

由于CSDN在chrome上显示效果与编辑页面都很友好&#xff0c;所以访问csdn或者维护博客时常使用chrome。 可恶的百度广告总是在左下角和右下角弹出&#xff0c;深恶痛绝啊&#xff01;&#xff01; 春天的到来&#xff01;&#xff01;—Adblock Plus插件 【1】下载 Adblock P…

在家可以做什么副业,适合新手的四个网上兼职

近期一个月&#xff0c;好多地方因口罩影响&#xff0c;多多少少都要求他们在家隔离&#xff0c;除开每日待在家里&#xff0c;也只能是在社区里散散步。想起很多小伙伴由于疫情在家里不可以工作中&#xff0c;收益逐渐变少少&#xff0c;很有可能的身上也有抵押借款和车辆贷款…

副业赚钱的路子有哪些?分享6种较为实用的副业方式

如今社会的压力越来越大&#xff0c;很多人都开始积极寻找副业赚钱的途径&#xff0c;以缓解生活中的经济压力。副业赚钱的方式多种多样&#xff0c;可以依据个人的兴趣爱好、特长技能来选择。以下分享6种较为实用的副业赚钱方式。 1、跑腿服务 跑腿服务是目前非常受欢迎的副业…

下午有自由时间可以做的副业推荐

对于大部分人来说&#xff0c;工资收入并不足以实现快速攒钱的目标。而且现在社会发展很快&#xff0c;大部分工作都不能保证稳定&#xff0c;所以发展自己的副业很重要。下面小编给大家推荐5个所有人都能做的副业&#xff0c;感兴趣的朋友可以从中选择适合自己的副业坚持做下去…

上班时间适合搞什么副业?最适合普通人的副业:用你的职业技能、生活经验来做

首先我告诉你所谓副业是和主业一样&#xff0c;或者说需要你投入十二分精力去对待的&#xff0c;需要你放弃社交娱乐&#xff0c;本质上就是一套自虐之路&#xff0c;做不到的还是老老实实上班才是正道 其次&#xff0c;你在网上看到所谓的副业介绍都只是别人的“副业”&#…

python网络副业有哪些?以自身经历分享怎么做副业挣钱

网络副业我个人比较看好的是Python&#xff0c;至少我是真实体会到了Python做副业真香&#xff0c;疫情被关在家那段时间也没耽误赚钱&#xff0c;反而比平常赚的还多一点&#xff0c;下图是我疫情期间在家做Python副业收入的部分截图&#xff0c;那会儿我用Excel表格每天记了一…

IT行业可以做的副业

去年一年&#xff0c;新冠疫情的阴霾让大部分职场人都不好过。当加薪和年终奖都遥不可及&#xff0c;不少人开始思考经营一份副业的可能性。 那么有没有什么是适合IT技术人员发展的副业呢&#xff1f;接外单赚取外快&#xff1f;不&#xff0c;这一定不会是最好的选择&#xff…

程序员可以做哪些副业?

原文链接&#xff1a;https://dsx2016.com/?p508 程序员自身的属性决定了副业的天花板。 最理想的情况是副业在赚钱的同时可以对主业进行属性加成。 同时如果主业做得好也能对副业产生积极的作用。 有鉴于996和24小时随机加班是it常态 推荐睡后收入的方式&#xff0c;并且长…

python可以做哪些副业

这是本文的目录 前言Python为什么会大受欢迎python副业有哪些1、兼职处理数据2、兼职查询资料3、兼职P图 零基础Python学习资料领取附上Python学习指南&#x1f449;Python学习路线汇总&#x1f448;&#x1f449;Python必备开发工具&#x1f448;&#x1f449;Python学习视频6…

电脑副业能做什么?一台电脑能做的副业

现在很多人都想在工作之余开展一些副业&#xff0c;特别是今年经济形势不好&#xff0c;更让很多人明白了&#xff0c;有一份副业的重要性&#xff0c;这样可以在自己没有工作的时候还能有一份收入&#xff0c;那么有哪些副业可以在网络上做呢&#xff1f;如果你只有一台电脑的…

程序员做什么副业比较好,都有哪些副业可做?

其实对每个普通人来讲&#xff0c;副业有很多形式&#xff0c;不过消耗时间少的副业才是最好的&#xff0c;投入产出比不等的副业那是给自己找麻烦。 一、程序员可以做的副业汇总 1.接私单&#xff0c;赚外快。 难度&#xff1a;极大 成本&#xff1a;时间成本精力成本尾款风…