#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)窗口框架(代码+注释)相关推荐

  1. 利用C++创建一个游戏(9)愤怒的小鸟(代码+注释)

    #include "stdafx.h" #include "MyGameFrame.h" #include <stdio.h>//小鸟结构体 str ...

  2. 利用C++创建一个游戏(3)游戏地图绘制(代码+注释)

    首先注意的是我们要将地图素材放置项目文件夹中. #include "stdafx.h" #include "MyGameFrame.h" //源cpp文件引申出 ...

  3. 利用C++创建一个游戏(4)计算机角色动画(代码+注释)

    一. 计算机角色的简单动画 先是使用Windows本身定时器创建程序的代码: #include "stdafx.h" #include "MyGameFrame.h&qu ...

  4. 利用GLFW创建一个窗口

    利用GLFW创建一个窗口 创建窗口前的准备工作 GLFW初始化 设置界面属性 界面相关属性 缓冲区相关属性 上下文相关属性 各个属性的默认值和取值范围 创建窗口 显示窗口 完整代码 窗口事件交互 完整 ...

  5. 2.创建适合游戏的窗口和消息循环

    2.创建适合游戏的窗口和消息循环 本章前言: 创建游戏窗口和处理消息循环是很重要的事情,我尝试过几种不同的窗口处理方式,这次打算使用WS_POPUP样式的窗口(无边框).上一次的框架代码把创建窗口和消 ...

  6. Windows编程 从消息窗口到基本窗口 游戏循环窗口框架的简单实现

    版本:VS2015 语言:C++ 本来想昨天写个消息窗口的内容,讲一些好玩的东西,不过没有时间了,就放到一起了. 今天正好把书的第二章看完了,感觉良好,Windows的编程确实难度要高,一下子会有一大 ...

  7. 利用thinkphp创建一个简单的站点

    本文我们将利用thinkphp创建一个简单的站点,这里所使用的thinkphp版本是5.0.24,这里是它的中文文档.如果有需要可以参考它的中文文档. thinkphp框架是一个典型的MVC框架,该框 ...

  8. Linux Namespace系列(09):利用Namespace创建一个简单可用的容器

    本文将演示如何利用namespace创建一个完整的容器,并在里面运行busybox.如果对namespace不是很熟悉,请先参考前面几遍介绍不同类型namespace的文章. busybox是一个Li ...

  9. 【Rust日报】2022-02-22 Slint - 为桌面和嵌入式设备创建一个新的GUI框架

    SixtyFPS现已更名为Slint SixtyFPS becomes Slint - Slint Blog 我们将SixtyFPS改名为Slint. 为什么要改变? 在2020年春天,我们启动了Si ...

  10. SDL2 简明教程(二):创建一个空的窗口

    系列文章目录 SDL2 简明教程(一):使用 Cmake 和 Conan 构建 SDL2 编程环境 SDL2 简明教程(二):创建一个空的窗口 文章目录 系列文章目录 创建空窗口 总结 创建空窗口 在 ...

最新文章

  1. 【SAP技术】SAP不能修改一个已经分配给交货单的HU
  2. netty发送数据_看完这篇还不清楚Netty的内存管理,那我就哭了
  3. python中的不可变类型和可变类型
  4. xml 连表查询(2) --自关联! 查询父类name,显示父类下的所有子类
  5. downloader怎么用 hls_如何下载企业微信直播回放视频(HLS格式)
  6. 通过EmbeddedServletContainerCustomizer接口调优Tomcat
  7. 某大型网络社区传播性XSS分析
  8. chrome developer tool 调试技巧2
  9. python展示文件_python之文件的读写和文件目录以及文件夹的操作实现代码
  10. 如何在官网下载scala
  11. idea注册账号_【Meta分析】Meta分析该不该注册?如何注册?什么时候注册?
  12. Matlab画曲线的切向量-quiver函数的应用
  13. 计算机资源管理菜单包括哪些,资源管理器文件菜单有哪些命令,资源管理器命令...
  14. 控制系统伯德图、带宽及动态响应的关联性
  15. 论文查找(网络与信息安全)
  16. 计算机开机最快设置,w7提高开机速度如何操作_win7电脑怎么开机更快
  17. Hopscotch(POJ-3050)
  18. 地震偏移成像matlab,地震偏移成像基本原理概述.ppt
  19. MPAndroidChart实现曲线阴影效果
  20. 负数在计算机中的存储和表示

热门文章

  1. web前端基础案例-开发QQ空间旋转时光轴
  2. 安装ubunut双系统,如何删除其中一个
  3. matlab mse mae,回归评价指标MSE、RMSE、MAE、R-Squared
  4. VMware8虚拟机安装教程
  5. 网页中图片无法显示解决方法
  6. JS实现图片不存在时显示默认图片
  7. 中望CAD的引线标注格式怎么改_大神说这样学CAD命令,超容易掌握
  8. 安卓初学者笔记(四):用白话讲明白Activity是什么
  9. 计算机软件的卸载,电脑里那些软件是不需要的?应该怎么卸载?
  10. 客户的sample和项目计划