版本: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编程 从消息窗口到基本窗口 游戏循环窗口框架的简单实现相关推荐

  1. 10 Windows编程——鼠标消息

    和鼠标相关的三个属于:click,double-click,drag 鼠标消息和键盘消息不同:只要鼠标跨越某个窗口,或者在某个窗口中按键,消息. 客户去鼠标消息 WM_MOUSEMOVE WM_[L, ...

  2. windows编程,消息函数中拦截消息的问题

    很多年没有写windows窗口程序了,今天自制基于vulkan的程序时遇到了一些问题,部分代码如下: LRESULT CALLBACK XWindow::WndProc(HWND hWnd, UINT ...

  3. window编程_消息分类

    Window应用程序利用Windows消息(Message) 与应用程序及系统进行信息交换. 消息分为: 消息号:有事先定义好的消息名标识 字节参数(wParam):用于提供消息的附加信息 长字节参数 ...

  4. Windows 编程

    Delphi 利用Object Pascal 和可视控件库(VCL)对底层的Windows API 进行了完美的封装,所以很少需要使用基础Pascal 语言来建立Windows应用程序,也无需直接调用 ...

  5. Windows编程捕获特定窗口及键盘鼠标消息模拟

    Windows编程捕获特定窗口及键盘鼠标消息模拟 一.简介 二.使用到的API简介 三.获取Windows记事本的编辑区窗口的句柄并模拟输入操作 1.分析 2.代码一 3.代码二 四.后记 一.简介 ...

  6. 初学Windows编程笔记1——窗口和消息

    Windows程序设计(第五版) 第三章 窗口与消息 源程序见原书39页 在Visual Studio 2010 C++下测试 //------------------Start----------- ...

  7. 【Windows编程】windows窗口创建过程详解

    文章目录 前言 1 应用程序的分类 2 应用程序分类的对比 3 编译工具 4 windows库文件和头文件 5 WinMain函数和MessageBox函数初始 6 窗口类 7 窗口类的分类 8 注册 ...

  8. Windows编程---使用C/C++语言创建一个窗口

    序言 记得刚学习C语言的时候,我还只能写出在"小黑框"里面运行的控制台程序.后来我了解到这种控制台程序属于命令行界面(CLI,Command-Line Interface),而我们 ...

  9. Windows消息机制学习笔记(二)—— 窗口与线程

    Windows消息机制学习笔记(二)-- 窗口与线程 要点回顾 消息从哪里来? 实验一:Spy++捕获消息 实验二:消息捕获 消息到哪里去? 窗口在哪? 实验:分析CreateWindowExW 窗口 ...

最新文章

  1. mybatis mapper.xml --注释 带参数的坑
  2. C语言面向对象编程(五):单链表实现
  3. o型圈沟槽设计_液压密封件产品、沟槽设计、安装质量要求
  4. nginx rewrite
  5. 对于SpringMVC框架使用的时候出现“警告: No mapping found for HTTP request with URI [/login]”的问题解决方案...
  6. 解决vue路由守卫报错信息
  7. 【0xC1900101】BOOT过程中的SAFE_OS阶段安装win10失败的解决方法
  8. HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术
  9. pat1032. Sharing (25)
  10. Sprint 敏捷开发
  11. iOS设备 历代 机型对照表
  12. # 20155327 2016-2017-4 《Java程序设计》第七周学习总结
  13. JavaScript isArray
  14. 如何防止恶意扫码点餐
  15. Javascript深克隆和浅克隆
  16. java解析outlook的msg邮件(outlook-message-parser)
  17. 【愚公系列】2022年10月 微信小程序-电商项目-确认订单功能实现
  18. 解决Vmware 16安装Windows7后安装VMware tools选项为灰色及无法成功安装问题
  19. 计算机毕业论文选题推荐|软件工程|系列九
  20. 从offer选择看互联网就业|薪资、团队、资本、ABC轮……

热门文章

  1. 老鹰主机怎么样_HawkHost老鹰主机香港机房速度怎么样?
  2. PSU CS Guest Lectures at CCUT(波特兰州立大学在长春工业大学的讲座课程)
  3. html在线编程工具,6 个强大的 HTML5 应用在线开发工具
  4. 羚珑视频编辑器开发总结
  5. 2.4gwifi能跑满100m宽带吗_100M以上宽带实测不到40M?四步教你排查元凶!
  6. 在QPixmap的图片上添加文字
  7. 一文读懂多帧超分辨率来龙去脉2019
  8. 诊断和解决row chained and migrated
  9. 中国移动、天猫都在用的区块链抽奖,了解一下?
  10. 互联网从业必备-历史最全互联网黑话词汇表分享