Windows编程 从消息窗口到基本窗口 游戏循环窗口框架的简单实现
版本:VS2015 语言:C++
本来想昨天写个消息窗口的内容,讲一些好玩的东西,不过没有时间了,就放到一起了。
今天正好把书的第二章看完了,感觉良好,Windows的编程确实难度要高,一下子会有一大堆的参数概念,但随着书本深入了解每个参数的含义,Windows编程大致的一些思路基本就出来了。
题外话,这本书绝对神书,游戏编程者都应该去看看,仅仅两个章节我就对整个游戏的循环有个大致的了解了,还有各类事件是如何进行处理的,从两个章节来看我第一次用Java编的贪吃蛇简直是渣渣,什么都没有,勉勉强强能够运行罢了。
首先来介绍一下一个最简单的窗口,打开VS2015,新建工程,把多余的代码删除,只留下一个返回的操作,然后在wWinMain函数中写下这样一行代码:
int i = MessageBox(NULL, TEXT("HELLO"), TEXT("TITLE"), MB_OKCANCEL | MB_ICONERROR);
运行效果:
红叉、HELLO、确定取消,该有的都有了。
1.第一参数hwnd:是父窗口的句柄,因为没有父窗口代表桌面,所以设置为NULL
2.第二参数lptext:正如所见是文本的内容
3.第三参数lpcaption:标题文本
4.第四参数utype:消息窗口的类型,就是有哪些按钮,我这边就设定了确定和取消两个按钮,并且如果点击确定和取消,外部的变量i还会获取到对应的值,有兴趣可以断个点看看
很简短对吧。关于类型能取一些什么值,我就不详细罗列了。
在正式玩基本窗口之前还有个好玩的东西就是MessageBeep,上面的是创建一个消息窗口,而这个是提示一个声音:
MessageBeep(MB_OK); //win10中警告声音都一样了。。。
嗯,试一下就有声音了。注释的意思是不管你设置成什么参数,都是那个声音。怎么形容呢,反正起到了提示玩家的作用。
OK,用Ctrl+K,松开K再按一下C注释一下代码,我们开始正式学习Windows基本窗口的程序了。让我学一下红孩儿,直接发代码,在代码上注释:
// Win32Project1.cpp : 定义应用程序的入口点。
//#include "stdafx.h"
#include "Win32Project1.h"static int windowNum = 0; //当前窗口的计数// 消息处理函数,相当于cocos中的callback
LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM IParam)
{switch (msg){case WM_CREATE: //创建消息{//初始化需要的资源}break;case WM_DESTROY: //WM_DESTROY是一个窗口销毁的消息,而WM_QUIT是退出应用程序的消息,也就是说一个应用程序可以包含0、1个或多个窗口{//窗口数量为0的时候发送结束应用程序的消息if(0 == --windowNum) PostQuitMessage(0);}break;default:DefWindowProc(hwnd, msg, wParam, IParam); //自动处理其他的消息}return (1);
}// 主函数,程序入口
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR lpCmdLine,_In_ int nCmdShow)
{// 来个消息框//int i = MessageBox(NULL, TEXT("HELLO"), TEXT("TITLE"), MB_OKCANCEL | MB_ICONERROR);// 来个声音//MessageBeep(MB_OK); //win10中警告声音都一样了。。。//MessageBeep(0xFFFFFFFF);//MessageBeep(MB_ICONASTERISK);//MessageBeep(MB_ICONHAND);//MessageBeep(MB_ICONQUESTION);// 开始创建一个基本的窗口// 创建窗口类WNDCLASSEX wndclass;wndclass.cbSize = sizeof(WNDCLASSEX);wndclass.style = NULL;// CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; //窗口的样式:改变宽度刷新、改变高度刷新、分配设备描述表、双击信息wndclass.lpfnWndProc = WindowProc; //回调函数wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //图标wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //光标wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景wndclass.lpszMenuName = NULL;wndclass.lpszClassName = TEXT("MyFirstWindow"); //窗口的名字wndclass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); //小应用图标if (!RegisterClassEx(&wndclass))return 0;// 创建窗口,上面的窗口类是一个模版,可以根据上面的模版创建多个窗口,但请注意第二个参数HWND hwnd = CreateWindowEx(NULL,//WS_EX_TOPMOST, //窗口特性,注释里设置为永远在最上方显示TEXT("MyFirstWindow"), //窗口名称,一定要和窗口类的lpszClassName对应TEXT("TITLE"), //标题WS_OVERLAPPEDWINDOW | WS_VISIBLE, //窗口的样式0, 0, //左上角坐标800, 600, //宽高NULL, //父窗口句柄,如果是桌面则为NULLNULL, //菜单窗口句柄hInstance, //应用程序实例NULL //高级特性);if (!hwnd) //创建失败返回return 0;++windowNum; //窗口数量加1ShowWindow(hwnd, nCmdShow); //显示窗口UpdateWindow(hwnd); //刷新窗口MSG msg; //消息缓存// 进入主循环while (true){if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) //有消息事件,注意最后一个参数,如果设置为PM_NOREMOVE的话不会销毁消息队列中的消息{/* 这边详细说一下GetMessage和PeekMessage的区别:* 1.首先说明,使用GetMessage是实现不了像游戏循环一样的效果的* 2.GetMessage像是事件触发一下,有了消息马上运行;而PeekMessage会反复的检查消息队列* 3.GetMessage,返回true代表消息不为WM_QUIT(退出应用程序的消息),返回false代表消息是WM_QUIT* 4.PeekMessage,返回true代表有消息,false没有消息,像游戏这样每帧需要刷新的使用这个是最好的**/if (msg.message == WM_QUIT)break;TranslateMessage(&msg); //转译消息DispatchMessage(&msg); //将消息发送给WindowProc函数处理}else //没有消息{//GameMain() //进入游戏的主循环}}return msg.wParam;
}
最终结果:
嗯,看到这里想必大家对游戏需要怎样一个窗口循环都有所了解了吧。最好是把上面代码给打一遍,好记性不如烂键盘嘛。
在这一章的结束,书的作者说你已经成为Windows专家了,我当时内心只浮现了四个字——神TMD。不同同样想把这句话送给学完上述程序的玩家们,恭喜你已经完成了Windows的教程了!
至于作者的问题,创建两个窗口,只有在关闭两个窗口后才会退出应用程序。很简单,在我的程序中有个静态变量来表示当前窗口的数量,在关闭窗口后判断一下是否为0,再决定是否要关闭应用程序。
有想了解相关编程的玩家们,希望能跟我一起学习,能有个关注是最好的了,哈哈。我会隔几天发一下自己的学习总结,直到这本书学完。
总结(创建Windows窗口的步骤):
1.WNDCLASSEX创建模版的窗口类
2.CreateWindowEx创建窗口,需要注册别忘了
3.编写主循环
4.写回调函数
书上有一个写的很好,消息是这样往下传的:
PeekMessage -> TranslateMessage -> DispatchMessage -> 你的回调函数
Windows编程 从消息窗口到基本窗口 游戏循环窗口框架的简单实现相关推荐
- 10 Windows编程——鼠标消息
和鼠标相关的三个属于:click,double-click,drag 鼠标消息和键盘消息不同:只要鼠标跨越某个窗口,或者在某个窗口中按键,消息. 客户去鼠标消息 WM_MOUSEMOVE WM_[L, ...
- windows编程,消息函数中拦截消息的问题
很多年没有写windows窗口程序了,今天自制基于vulkan的程序时遇到了一些问题,部分代码如下: LRESULT CALLBACK XWindow::WndProc(HWND hWnd, UINT ...
- window编程_消息分类
Window应用程序利用Windows消息(Message) 与应用程序及系统进行信息交换. 消息分为: 消息号:有事先定义好的消息名标识 字节参数(wParam):用于提供消息的附加信息 长字节参数 ...
- Windows 编程
Delphi 利用Object Pascal 和可视控件库(VCL)对底层的Windows API 进行了完美的封装,所以很少需要使用基础Pascal 语言来建立Windows应用程序,也无需直接调用 ...
- Windows编程捕获特定窗口及键盘鼠标消息模拟
Windows编程捕获特定窗口及键盘鼠标消息模拟 一.简介 二.使用到的API简介 三.获取Windows记事本的编辑区窗口的句柄并模拟输入操作 1.分析 2.代码一 3.代码二 四.后记 一.简介 ...
- 初学Windows编程笔记1——窗口和消息
Windows程序设计(第五版) 第三章 窗口与消息 源程序见原书39页 在Visual Studio 2010 C++下测试 //------------------Start----------- ...
- 【Windows编程】windows窗口创建过程详解
文章目录 前言 1 应用程序的分类 2 应用程序分类的对比 3 编译工具 4 windows库文件和头文件 5 WinMain函数和MessageBox函数初始 6 窗口类 7 窗口类的分类 8 注册 ...
- Windows编程---使用C/C++语言创建一个窗口
序言 记得刚学习C语言的时候,我还只能写出在"小黑框"里面运行的控制台程序.后来我了解到这种控制台程序属于命令行界面(CLI,Command-Line Interface),而我们 ...
- Windows消息机制学习笔记(二)—— 窗口与线程
Windows消息机制学习笔记(二)-- 窗口与线程 要点回顾 消息从哪里来? 实验一:Spy++捕获消息 实验二:消息捕获 消息到哪里去? 窗口在哪? 实验:分析CreateWindowExW 窗口 ...
最新文章
- mybatis mapper.xml --注释 带参数的坑
- C语言面向对象编程(五):单链表实现
- o型圈沟槽设计_液压密封件产品、沟槽设计、安装质量要求
- nginx rewrite
- 对于SpringMVC框架使用的时候出现“警告: No mapping found for HTTP request with URI [/login]”的问题解决方案...
- 解决vue路由守卫报错信息
- 【0xC1900101】BOOT过程中的SAFE_OS阶段安装win10失败的解决方法
- HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术
- pat1032. Sharing (25)
- Sprint 敏捷开发
- iOS设备 历代 机型对照表
- # 20155327 2016-2017-4 《Java程序设计》第七周学习总结
- JavaScript isArray
- 如何防止恶意扫码点餐
- Javascript深克隆和浅克隆
- java解析outlook的msg邮件(outlook-message-parser)
- 【愚公系列】2022年10月 微信小程序-电商项目-确认订单功能实现
- 解决Vmware 16安装Windows7后安装VMware tools选项为灰色及无法成功安装问题
- 计算机毕业论文选题推荐|软件工程|系列九
- 从offer选择看互联网就业|薪资、团队、资本、ABC轮……
热门文章
- 老鹰主机怎么样_HawkHost老鹰主机香港机房速度怎么样?
- PSU CS Guest Lectures at CCUT(波特兰州立大学在长春工业大学的讲座课程)
- html在线编程工具,6 个强大的 HTML5 应用在线开发工具
- 羚珑视频编辑器开发总结
- 2.4gwifi能跑满100m宽带吗_100M以上宽带实测不到40M?四步教你排查元凶!
- 在QPixmap的图片上添加文字
- 一文读懂多帧超分辨率来龙去脉2019
- 诊断和解决row chained and migrated
- 中国移动、天猫都在用的区块链抽奖,了解一下?
- 互联网从业必备-历史最全互联网黑话词汇表分享