利用C++创建一个游戏(1)窗口框架(代码+注释)
#include "stdafx.h"
#include "MyGameFrame.h" //源cpp文件引申出的头文件 也可以用resource.h代替 // 全局变量:
HINSTANCE hInst; // 当前实例
HWND hWnd; //窗口句柄// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitWindow(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(/*APIENTRY 是Windows SDK函数调用的入口WinMain 函数功能:1)创建游戏主窗口;2)获得游戏玩家输入的消息;3)分配玩家输入消息并响应消息。HINSTANCE 是Windows里的一种数据类型(句柄型),其实就是一个无符号的长整形,是32位的,是用于标示(记录)一个程序的实例,是识别游戏程序的句柄hPrevInstance用于跟踪应用程序的前一个实例。LPSTR 一个32位指向字符串的指针lpCmdLine 是一个以NULL结尾的字符串。nCmdShow 是程序启动期间传递给游戏程序的一个整数,指定游戏窗口的显示方式*/HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{ // 初始化全局字符串 MyRegisterClass(hInstance);// 执行应用程序初始化: if (!InitWindow(hInstance, nCmdShow))//初始化窗口 {return FALSE;//如果不成功则返回FALSE,并退出程序 }/*MSG类型见 https://blog.csdn.net/wanghaofeng/article/details/6632165*/MSG msg; //创建消息类对象 // TODO: 在此放置运行代码。// 主消息循环: PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);//赋初值 /*前面的四个参数(一个指向MSG结构的指针、一个窗口句柄、两个值指示消息范围)与GetMessage的参数相同。将第二、三、四个参数设定为NULL或0时,表明我们想让PeekMessage传回程序中所有窗口的所有消息。如果要将消息从消息队列中删除,则将PeekMessage的最后一个参数设定为PM_REMOVE。如果您不希望删除消息,那么您可以将这个参数设定为PM_NOREMOVE。这就是为什么Peek_Message是「偷看」而不是「取得」的原因,它使得程序可以检查程序的队列中的下一个消息,而不实际删除它。*/while (msg.message != WM_QUIT) //进入游戏消息循环: {if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){TranslateMessage(&msg); //获得游戏玩家输入的消息; DispatchMessage(&msg);//分配玩家消息并响应用户消息。 }}//如果你不喜欢上面从初始化到结束的写法,也可以这样写,这样可以不用初始化PeekMessage() /*while (PeekMessage(&msg, nullptr, 0, 0,PM_REMOVE)){if (msg.message == WM_QUIT) break;//WM_QUIT 用来结束程序运行进入游戏消息循环TranslateMessage(&msg); //获得游戏玩家输入的消息DispatchMessage(&msg); //分配玩家消息并响应用户消息}*/return (int)msg.wParam;
}//
// 函数: MyRegisterClass()
//
// 注册Windows类,一款游戏有且仅有一个主窗口,与游戏程序唯一对应。创建游戏窗口前要填写窗口类结构体WNDCLASSEX
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEX wcex ={wcex.cbSize = sizeof(WNDCLASSEX),/*窗口类的风格标志。运用“或”操作(操作符“|”)将一些基本风格的标识符组合,就可以实现游戏窗口风格的多重性设定窗口进行绘图,可通过CS_OWNDC得到设备描述表例:wcex.style = CS_VERDRAW | CS_HREDRAW;*/CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,/*WndProc //窗口消息处理函数的指针,接收一个指向窗口函数的指针,将执行所有的窗口任务。int cbClsExtra; //分配给窗口类结构之后的额外字节数int cbWndExtra; //分配给窗口实例之后的额外字节数ps:cbClsExtra和cbWndExtra用来指示Windows类中保留一些额外空间,如保存附加的运行时间信息,一般都为0。*/WndProc,0,0,/*窗口所对应的应用程序的句柄,表示窗口所对应程序的句柄,在启动时传递给WinMain( )函数的句柄实例。wcex.hInstance = hinstance;*/hInstance,/*重点:此处的IDI_MYGAMEFRAME(PPT中为IDI_GAMEFRAME)应当替换为IDI_(项目名),IDI_(项目名)位于resource.h文件中!!MAKEINTRESOURCE用来将数字类型转化为指针类型HICON LoadIcon(HINSTANCE hInstance, LPCTSTR LpIconName)函数获得指向通用系统图标的句柄参数hInstance是从应用程序装载图标资源实例,为NULL表示装载标准图标。LpIconName:被装载图标资源名称。例:wcex.hIcon = loadIcon (NULL, IDI_APPLICATION);*/LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYGAMEFRAME)),/*HCURSOR LoadCursor(HINSTANCE hInstance, LPCTSTR lpCursorName)函数得到资源或预定义的系统光标。资源是编译到游戏程序中的数据,如位图、图标、声音等hInstance:是从应用程序装载光标资源的实例,默认为NULL。lpCursorName则标识了资源名字符串或资源句柄。例:wcex.hCursor = LoadCursor (NULL, IDC_ARROW);*/LoadCursor(NULL, IDC_ARROW),(HBRUSH)(COLOR_WINDOW + 1),NULL,/*窗口菜单名窗口类的名称,给游戏窗口类名一个独一无二名称。重点:调用CreateWindow( )函数将用到这个名称,游戏窗口名称常常与程序名称完全一致_T将ASCII字符串转化为Unicode字符或者将项目属性-字符集调整为“使用多字符集”!!!*/_T("GameFrame"),/*应用程序小图标,是应用程序小图标。指向窗口的标题栏和Windows桌面任务栏显示的图标。*/LoadIcon(NULL,MAKEINTRESOURCE(IDI_SMALL))};return RegisterClassEx(&wcex);
}//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitWindow(HINSTANCE hInstance, int nCmdShow)
{hInst = hInstance; // 将实例句柄存储在全局变量中 /*HWND CreateWindow(LPCTSTR lpClassName, //类名指针LPCTSTR lpWindowName, //窗口名指针DWORD dwStyle, //窗口样式int x, //窗口的水平坐标int y, //窗口的竖直坐标int nWidth, //窗口宽度int nHeight, //窗口高度HWND hWndParent, //父窗口句柄HMENU hMenu, //菜单句柄或子窗口标识符HINSTANCE hInstance, //应用程序实例句柄LPVOID lpParam //指向窗口创建数据的指针);*/hWnd = CreateWindow(_T("GameFrame"),_T("游戏框架"),WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX,//普通样式,不能改变大小,不能最大化 CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, nullptr, nullptr, hInstance, nullptr);if (!hWnd){return FALSE;}/*显示和刷新窗口BOOL ShowWindow( HWND hWnd, int nCmdShow )*/ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{PAINTSTRUCT ps; //用于WM_PAINT HDC hdc; //设备场景句柄 switch (msg) //判断消息 {case WM_CREATE://执行初始化代码 return(0);break;case WM_PAINT://确定窗口是否有效 hdc = BeginPaint(hwnd, &ps);//TODO:添加执行绘制代码 //结束代码 EndPaint(hwnd, &ps);return(0);break;case WM_DESTROY://关闭程序,发送WM_QUIT消息 PostQuitMessage(0);return(0);break;default:break;}return (DefWindowProc(hwnd, msg, wparam, lparam));
}
利用C++创建一个游戏(1)窗口框架(代码+注释)相关推荐
- 利用C++创建一个游戏(9)愤怒的小鸟(代码+注释)
#include "stdafx.h" #include "MyGameFrame.h" #include <stdio.h>//小鸟结构体 str ...
- 利用C++创建一个游戏(3)游戏地图绘制(代码+注释)
首先注意的是我们要将地图素材放置项目文件夹中. #include "stdafx.h" #include "MyGameFrame.h" //源cpp文件引申出 ...
- 利用C++创建一个游戏(4)计算机角色动画(代码+注释)
一. 计算机角色的简单动画 先是使用Windows本身定时器创建程序的代码: #include "stdafx.h" #include "MyGameFrame.h&qu ...
- 利用GLFW创建一个窗口
利用GLFW创建一个窗口 创建窗口前的准备工作 GLFW初始化 设置界面属性 界面相关属性 缓冲区相关属性 上下文相关属性 各个属性的默认值和取值范围 创建窗口 显示窗口 完整代码 窗口事件交互 完整 ...
- 2.创建适合游戏的窗口和消息循环
2.创建适合游戏的窗口和消息循环 本章前言: 创建游戏窗口和处理消息循环是很重要的事情,我尝试过几种不同的窗口处理方式,这次打算使用WS_POPUP样式的窗口(无边框).上一次的框架代码把创建窗口和消 ...
- Windows编程 从消息窗口到基本窗口 游戏循环窗口框架的简单实现
版本:VS2015 语言:C++ 本来想昨天写个消息窗口的内容,讲一些好玩的东西,不过没有时间了,就放到一起了. 今天正好把书的第二章看完了,感觉良好,Windows的编程确实难度要高,一下子会有一大 ...
- 利用thinkphp创建一个简单的站点
本文我们将利用thinkphp创建一个简单的站点,这里所使用的thinkphp版本是5.0.24,这里是它的中文文档.如果有需要可以参考它的中文文档. thinkphp框架是一个典型的MVC框架,该框 ...
- Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
本文将演示如何利用namespace创建一个完整的容器,并在里面运行busybox.如果对namespace不是很熟悉,请先参考前面几遍介绍不同类型namespace的文章. busybox是一个Li ...
- 【Rust日报】2022-02-22 Slint - 为桌面和嵌入式设备创建一个新的GUI框架
SixtyFPS现已更名为Slint SixtyFPS becomes Slint - Slint Blog 我们将SixtyFPS改名为Slint. 为什么要改变? 在2020年春天,我们启动了Si ...
- SDL2 简明教程(二):创建一个空的窗口
系列文章目录 SDL2 简明教程(一):使用 Cmake 和 Conan 构建 SDL2 编程环境 SDL2 简明教程(二):创建一个空的窗口 文章目录 系列文章目录 创建空窗口 总结 创建空窗口 在 ...
最新文章
- 【SAP技术】SAP不能修改一个已经分配给交货单的HU
- netty发送数据_看完这篇还不清楚Netty的内存管理,那我就哭了
- python中的不可变类型和可变类型
- xml 连表查询(2) --自关联! 查询父类name,显示父类下的所有子类
- downloader怎么用 hls_如何下载企业微信直播回放视频(HLS格式)
- 通过EmbeddedServletContainerCustomizer接口调优Tomcat
- 某大型网络社区传播性XSS分析
- chrome developer tool 调试技巧2
- python展示文件_python之文件的读写和文件目录以及文件夹的操作实现代码
- 如何在官网下载scala
- idea注册账号_【Meta分析】Meta分析该不该注册?如何注册?什么时候注册?
- Matlab画曲线的切向量-quiver函数的应用
- 计算机资源管理菜单包括哪些,资源管理器文件菜单有哪些命令,资源管理器命令...
- 控制系统伯德图、带宽及动态响应的关联性
- 论文查找(网络与信息安全)
- 计算机开机最快设置,w7提高开机速度如何操作_win7电脑怎么开机更快
- Hopscotch(POJ-3050)
- 地震偏移成像matlab,地震偏移成像基本原理概述.ppt
- MPAndroidChart实现曲线阴影效果
- 负数在计算机中的存储和表示