微信号:gh_5f9337df4e69

介绍:讨论和学习C/C++的编程知识

第九十七讲 MFrame3D(3)

2014-12-14 16:56 零灵柒

上一讲我们说了一个窗口基类,因为不管我们是要写一个3D的界面又或者是写一些窗口的应用程序我们都少不了要一个窗口这作为容器,而MwindowBase这个类就为我们提供了这个功能,那么有些同学可能会疑惑,他怎么就产生出窗口来呢,很简单,我们只需要子类化这个类就能够轻松办到,自所以需要子类化,是因为有些东西我们一开始就没想暴露给用户,所以在这个类里面将他们声明为proteced,这样外部访问不了,但是他的子类可以访问,在这个3D框架里,我们子类化一个MWindow的类出来,如下:
//=============================
//class MWindow
//MWindow.h
/**********************************
*
*
* 在3D环境中的窗口类
* by Mengjin
*
**********************************/
#pragma once
#include "WindowBase.h"

namespace Mengjin{
class MWindow : public MWindowBase
{
public:
MWindow();
MWindow(const std::wstring& title,const std::wstring& wndname);
MWindow(HINSTANCE hInstance,HINSTANCE hPreInstance,PSTR szCmdLine,
int iCmdShow,const std::wstring& title,const std::wstring& wndname);
virtual ~MWindow(void);
public:
virtual void show();
virtual int run();
virtual bool Create();
virtual HWND NewWindow();
};
}
//====================================

他的实现很简单,因为很东西我们都在底层实现了,所以这里我们只是简单的包装一下,把接口扔出去就ok,就算是简单,我还是将实现给列出来:
//===================================
//MWindow.cpp

#include "MWindow.h"

namespace Mengjin{

//构造函数
MWindow::MWindow(){
}


MWindow::MWindow(const std::wstring& title,const std::wstring& wndname):
MWindowBase(nullptr,nullptr,"",SW_SHOW,title,wndname){
}

MWindow::MWindow(HINSTANCE hInstance,HINSTANCE hPreInstance,PSTR szCmdLine,
int iCmdShow,const std::wstring& title,const std::wstring& wndname):
MWindowBase(hInstance,hPreInstance,szCmdLine,iCmdShow,title,wndname)
{
}


//析构函数
MWindow::~MWindow(void)
{
}

//显示窗口
void MWindow::show(){
showwindow();
}

//消息循环
int MWindow::run(){
return msgloop();
}

//创建窗口
bool MWindow::Create(){
return GenWindow();
}

//获取窗口句柄
HWND MWindow::NewWindow(){
if(m_hwnd){
return m_hwnd;
}
if(m_wndclassname.empty()){
throw L"窗口类型名不能为空!!!";
return nullptr;
}
if(m_hInstance == nullptr){
//如果没有实例句柄,我们可以获取实例句柄
m_hInstance = GetModuleHandle(nullptr);
}
if (m_hInstance == nullptr){
//如果我们上面还是没有获取句柄,那么久抛出异常吧
throw L"窗口实际句柄不能为空!!!";
return nullptr;
}
if(!init()){
throw L"窗口类注册失败!!!";
return nullptr;
}
if(!GenWindow()){
throw L"窗口创建失败!!!";
return nullptr;
}
return m_hwnd;
}
}
//=======================================

这么一来问题变得简单了,我们可以很容易生成一个窗口出来:
//=======================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, char* cmdline, int showcmd){

try{
MWindow w(hInstance, hPreInstance, cmdline, showcmd, L"Test", L"Test");
w.Create();
w.show();
w.run();
return 0;
}
catch (const wchar_t* s){
MessageBox(nullptr, s, L"Error", MB_OK);
return -1;
}
}
//=======================================

ok,窗口出来了,接下来我们的任务就是将3D图像给装进这个窗口之中,也就是说,这个窗口就是我们3D框架的容器了,因为MWindow3D这个类有些大,只能另开一讲来细说,所以今天就到这里吧。


====================
回复D&d直接查看目录


 
C/C++的编程教室 更多文章 写在开篇 第一讲 Hello World 第二讲 printf()(1) 第三讲 printf()(2) 第四讲 scanf()
猜您喜欢 Google征战VR的白日梦(DayDream) IBM Spark大赛启动 10万美元悬赏最佳Spark应用 架构漫谈(三):如何做好架构之识别问题 改变视角 【得数据者得天下】一位数据挖掘大牛眼中的“大数据与企业的数据化运营”。