X 2.0嵌入MFC的子窗体的方法(1.0姐妹篇)

红孩儿的游戏编程之路

红孩儿Cocos2d-X学习园地QQ群:249941957 加群写:Cocos2d-x

另本章为我的Cocos2d-x教程一书初稿。望各位看官多提建议!

Cocos2d-X 2.0嵌入MFC的子窗体的方法(1.0姐妹篇)

本节所用Cocos2d-x版本:cocos2d-2.0-x-2.0.2

Cocos2d-x 2.0

如图:

IDC_COCOS2DXWIN保存。

好,现在主对话框类里有了这么一句:

public:CStaticm_Cocos2dXWin;

点击“添加”。这时会弹出“MFC类向导”对话框。我们在类名里输入“CCocos2dXWin”,并选择基类CWnd。然后点击“完成”。

向导会为我们的工程自动加入两个文件“Cocos2dXWin.h”和“Cocos2dXWin.cpp”。这才是我们要进行Cocos2d-x显示的窗体类,它的基类是CWnd,与Picture控件有相同的基类。

打开Cocos2dXWin.h,在CCocos2dXWin类中增加一个public成员函数声明:

//创建Cocos2dX窗口BOOLCreateCocos2dXWindow();private://是否已经初始化BOOLm_bInitCocos2dX;#include "../Classes/AppDelegate.h"#include "cocos2d.h"

下面来手动增加函数定义:

//创建Cocos2dX窗口BOOLCCocos2DXWin::CreateCocos2dXWindow(){//新建一个CRect变量获取窗口的客户区大小CRecttClientRect;GetClientRect(&tClientRect);//取得使用的OpenGL视窗CCEGLView* eglView = CCEGLView::sharedOpenGLView();//以指定的客户区大小创建视窗,这里我们对setFrameSize增加了参数3以传入当前控件的窗口句柄。eglView->setFrameSize(tClientRect.Width(),tClientRect.Height(),GetSafeHwnd());//调用程序的运行函数,增加参数bool型变量控制是否进行消息循环。因为MFC控件本身有自已的消息响应处理。如果不改动的话,这里就会进入死循环。cocos2d::CCApplication::sharedApplication()->run(false);//这里将变量设置为TRUEm_bInitCocos2dX = TRUE;return TRUE;}

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:] int CCApplication::run(bool bMsgLoop){PVRFrameEnableControlWindow(false);// Main message loop:MSG msg;LARGE_INTEGER nFreq;LARGE_INTEGER nNow;//帧定时器取得CPU时钟频率和计数QueryPerformanceFrequency(&nFreq);QueryPerformanceCounter(&m_nLast);// 调用派生类的程序启动处理函数if (!applicationDidFinishLaunching()){return 0;}CCEGLView* pMainWnd = CCEGLView::sharedOpenGLView();//手动修改if(true == bMsgLoop){//窗口居中显示mainWnd->centerWindow();ShowWindow(mainWnd->getHWnd(), SW_SHOW);while (1){if (! PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){// Get current time tick.QueryPerformanceCounter(&nNow);//由帧间隔来控制刷新if (nNow.QuadPart – m_nLast.QuadPart > m_nAnimationInterval.QuadPart){m_nLast.QuadPart = nNow.QuadPart;CCDirector::sharedDirector()->mainLoop();}else{Sleep(0);}continue;}//如果收到退出消息,中断消息循环。if (WM_QUIT == msg.message){// Quit message loop.break;}// 按键消息处理if (! m_hAccelTable || ! TranslateAccelerator(msg.hwnd, m_hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam;}return 0;}

函数声明与cpp保持一致setFrameSize函数,继续手术:

void CCEGLView::setFrameSize(float width, float height,HWND hWnd){//由指定的大小和句柄创建窗体Create((LPCTSTR)m_szViewName, (int)width, (int)height,hWnd);//调用基类的setFrameSize函初始化整屏幕和分辨率CCEGLViewProtocol::setFrameSize(width, height);} 再找到Create函数://创建窗口bool CCEGLView::Create(LPCTSTR pTitle, int w, int h, HWND hWnd){bool bRet = false;do {//如果已经创建了窗体,直接返回,不允许再重复创建。CC_BREAK_IF(m_hWnd);//在这里做个判断,如果参数中的窗口句柄不为空,则使用参数句柄做为成员变量m_hWnd的值。if(hWnd){m_hWnd = hWnd ;//新增bool变量m_bIsPopupWin,用于标记是否使用已经创建好的WINDOWS控件窗口句柄做为当前OpenGL视窗的WINDOWS窗口句柄。m_bIsPopupWin = false;}else{HINSTANCE hInstance = GetModuleHandle( NULL );WNDCLASS wc;// Windows Class Structure// Redraw On Size, And Own DC For Window.wc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;wc.lpfnWndProc = _WindowProc;// WndProc Handles Messageswc.cbClsExtra= 0;// No Extra Window Datawc.cbWndExtra= 0;// No Extra Window Datawc.hInstance= hInstance;// Set The Instancewc.hIcon= LoadIcon( NULL, IDI_WINLOGO );// Load The Default Iconwc.hCursor= LoadCursor( NULL, IDC_ARROW );// Load The Arrow Pointerwc.hbrBackground = NULL;// No Background Required For GLwc.lpszMenuName = NULL;// We Don’t Want A Menuwc.lpszClassName = kWindowClassName;// Set The Class NameCC_BREAK_IF(! RegisterClass(&wc) && 1410 != GetLastError());// center window positionRECT rcDesktop;GetWindowRect(GetDesktopWindow(), &rcDesktop);WCHAR wszBuf[50] = {0};MultiByteToWideChar(CP_UTF8, 0, m_szViewName, -1, wszBuf, sizeof(wszBuf));// create windowm_hWnd = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,// Extended Style For The WindowkWindowClassName,// Class NamewszBuf,// Window TitleWS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX,// Defined Window Style0, 0,// Window Position0,// Window Width0,// Window HeightNULL,// No Parent WindowNULL,// No MenuhInstance,// InstanceNULL );}//判断窗口句柄有效CC_BREAK_IF(! m_hWnd);//调整窗口大小resize(w, h); //初始化OpenGLbRet = initGL();CC_BREAK_IF(!bRet);s_pMainWindow = this;bRet = true;} while (0);return bRet;}

函数声明与cpp保持一致。

人情似纸张张薄,世事如棋局局新。

X 2.0嵌入MFC的子窗体的方法(1.0姐妹篇)

相关文章:

你感兴趣的文章:

标签云: