一、序言
众所周知:
MFC适合桌面应用的开发,而不太适合windows游戏编程,因为它封装了很多我们游戏编程中所不需要的东西,这些东西在一定程度上都影响着GDI的效率,略显冗余了。但是MFC有丰富的类库,这在写代码时又能提供很大的方便……
再来看看Win32 SDK,接近底层,效率肯定好,但是却没有MFC那样的类库,写代码着实不太方便……
这样一想,我就有个问题了:在接下来的游戏效果模拟中,是继续使用MFC,还是专用Win32SDK呢?或者还有什么更好的方法?……
这么一想,嘿,一个idea就诞生了:用C++来自行架构一个适合windows游戏编程的框架,使它既能使用MFC类库,效率又更好
这个框架如何架构呢?请继续阅读下面的内容吧^_^
二、架构的一个简易框架,MFC类库、效率都能兼顾
我的架构思路:
1>将窗口创建过程(设计窗口类结构体实例、注册窗口类、创建窗口、显示窗口、消息循环)以及消息响应函数都封装在一个名为CCWindow的C++类中
2>在Main.cpp源文件中就实现WinMain以及窗口过程
由于我的开源框架的源代码中有详尽的注释,F话就不多说了,直接贴上源代码:
StdAfx.h头文件:这是使用MFC类库所必须添加的头文件
/*** * * StdAfx.h * 包含一些用到的类库所在的头文件 * ***/ #pragma once #define _AFXDLL//动态添加MFC类库 #include//定义最高版本windows #include // MFC封装的核心组件和标准组件 #include //CImage类包含的头文件 #include //播放媒体(音乐)所需包含的头文件 #pragma comment(lib, winmm.lib)//添加媒体库 #pragma comment(linker,/manifestdependency: ype='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*')
CWindow.h头文件(CCWindow类的定义)
#pragma once #includeStdAfx.h #includeclass CCWindow { //==================成员==================== private: WNDCLASS m_wndclass; //窗口类结构体实例 public: HWND m_hwnd; //窗口句柄 CImage m_img; //背景图片 CRect m_rect; //窗口户区大小 //=============窗口创建相关的成员函数============= public: //设计窗口类 bool InitWndClass( HINSTANCE hInstance, //实例句柄 WNDPROC wpWndProc, //窗口过程 LPCTSTR lpWndName, //窗口名称 LPCTSTR lpIconPath); //图标路径 //设计窗口类 bool InitWndClass(WNDCLASS); //注册窗口类 ATOM RegisterWndClass(); //创建窗口(默认居中) void Create( LPCTSTR lpClassName, //窗口类名称 LPCTSTR lpWndName, //窗口标题名称 DWORD dwStyle, //窗口风格 int nWidth, //窗口宽度 int nHeight); //窗口高度 //显示窗口 void Show(int); //一般的消息循环 int RunMsgLoop(); //更高效的消息循环 int RunMsgLoop(void (*Display)(), int); //================消息响应函数================ public: //注:在这里添加需要响应的消息处理函数的声明 public: //构造函数 CCWindow(void); //析构函数 ~CCWindow(void); };
CWindow.cpp(CCWindow类的成员函数实现)
#include CWindow.h CCWindow::CCWindow(void) { } CCWindow::~CCWindow(void) { } /*------------------------------ *功能:设计窗口类 *@hInstance: 实例句柄 *@WndProc: 窗口过程 *@WndName: 窗口名称 *@IconPath: 图标路径 -----------------------------*/ bool CCWindow::InitWndClass(HINSTANCE hInstance,//实例句柄 WNDPROC WndProc, //窗口过程 LPCTSTR WndName, //窗口名称 LPCTSTR IconPath) //图标路径 { ZeroMemory(&m_wndclass, sizeof(WNDCLASS)); m_wndclass.style = CS_HREDRAW | CS_VREDRAW; m_wndclass.lpfnWndProc = WndProc; m_wndclass.hInstance = hInstance; m_wndclass.cbClsExtra = 0; m_wndclass.cbWndExtra = 0; m_wndclass.hIcon = static_cast(LoadImage(NULL, IconPath, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE)); m_wndclass.hCursor = ::LoadCursor(NULL, IDC_ARROW); m_wndclass.hbrBackground = static_cast (GetStockObject(WHITE_BRUSH)); m_wndclass.lpszMenuName = NULL; m_wndclass.lpszClassName = WndName; return true; } /*-------------