基于MFC的Direct3D程序设计

简介:
原文链接:MFC D3D Application: Direct3D Tutorial Part I
     作者这个MFC程序中第一个有趣的地方是让用于Direct3D绘制的窗口类从CWnd类和CXD3D类继承下来:
class CD3DWnd : public CXD3D, public CWnd

CD3DWnd类是用于窗口中控件(比如一个PictureBox)的基类,这个控件将提供普通Cwnd类的功能,但同时也拥有CXD3D的3D绘制的能力。

先来看CXD3D类:

复制代码
//-----------------------------------------------------------------------------
// CXD3D class: the class a view class will derive from to provide a window
// handle to render into, and that will override the 3D scene rendering.
//-----------------------------------------------------------------------------
class CXD3D
{
protected:
    // internal state variables
    bool m_bActive;                // toggled on Pause, can be queried upon
                                // initializing to issue a Create [false]
    bool m_bStartFullscreen;    // queried on ChooseInitialSettings [false]
    bool m_bShowCursor;            // in fullscreen mode [true]
    bool m_bClipCursor;            // in fullscreen mode [true]
    bool m_bWindowed;            // queried on BuildPresentParamsFromSettings
                                // [true]
    bool m_bIgnoreSizeChange;    // queried on HandlePossibleSizeChange [false]
    bool m_bDeviceLost;                // true when the device's Present fails
    bool m_bDeviceObjectsInited;    // true if InitDeviceObjects succeeds
    bool m_bDeviceObjectsRestored;    // true if RestoreDeviceObjects succeeds
    // internal timing variables
    FLOAT m_fTime;                    // absolute time handled by DXUtil_Timer
    FLOAT m_fElapsedTime;            // elapsed time handled by DXUtil_Timer
    FLOAT m_fFPS;                    // the frame rate, or frames per second
    // statistics
    TCHAR m_strDeviceStats[256];        // device description
    TCHAR m_strFrameStats[16];            // frame statistics
    // main objects used for creating and rendering the 3D scene
    HWND                    m_hWndRender;        // device window
    HWND                    m_hWndFocus;        // focus window
    LPDIRECT3D9                m_pd3d;                // main D3D object
    LPDIRECT3DDEVICE9        m_pd3dDevice;        // D3D rendering device
    D3DPRESENT_PARAMETERS    m_d3dpp;            // presentation parameters
    DWORD                    m_dwCreateFlags;    // sw/hw VP + pure device
    DWORD                    m_dwWindowStyle;    // saved for mode switches
    RECT                    m_rcWindow;            // window and client rects,
    RECT                    m_rcClient;            // saved for mode switches
    // setup objects
    CXD3DEnum Enumeration;        // hierarchy of adapters, modes, devices, etc.
    CXD3DSettings Settings;        // current display settings
protected:
    // internal error handling function
    HRESULT DisplayErrorMsg(HRESULT hr, DWORD dwType);
    // internal management functions
    void    BuildPresentParamsFromSettings();
    bool    FindBestWindowedMode(bool bHAL, bool bREF);
    bool    FindBestFullscreenMode(bool bHAL, bool bREF);
    HRESULT ChooseInitialSettings();    
    HRESULT InitializeEnvironment();
    HRESULT ResetEnvironment();
    void    CleanupEnvironment();
public:
    HRESULT RenderEnvironment();
    HRESULT HandlePossibleSizeChange();
protected:
    void    UpdateStats();
    // Overridable functions for the 3D scene created by the app
    virtual HRESULT OneTimeSceneInit()            { return S_OK; }
    virtual HRESULT InitDeviceObjects()            { return S_OK; }
    virtual HRESULT RestoreDeviceObjects()        { return S_OK; }
    virtual HRESULT FrameMove()                    { return S_OK; }

    virtual HRESULT InvalidateDeviceObjects()    { return S_OK; }
    virtual HRESULT DeleteDeviceObjects()        { return S_OK; }
    virtual HRESULT FinalCleanup()                { return S_OK; }
    
public:
    virtual HRESULT Render()                    { return S_OK; }
    // construct/destruct, create and pause/play
    CXD3D();
    virtual ~CXD3D() { }
    virtual HRESULT CreateD3D();
    virtual void Pause(bool bPause);
    // active state wrapper
    bool IsActive() { return m_bActive; };
    // device and frame statistics wrappers
    LPCTSTR GetDeviceStats() { return m_strDeviceStats; }
    LPCTSTR GetFrameStats()  { return m_strFrameStats; }
};

复制代码

CXD3D实现文件
在CXD3D::CreateD3D函数中,首先初始化了一个D3D对象,然后构建了一个列表,这个列表包含了机器上的所有显卡,显卡模式和设备。我们需要知道机器上有多少显卡(一般只有一个),而且每个显卡也可以支持多个设备。对于每个设备会有一种支持的格式,设置和能力,这对于应用程序来说不一定是合适的,因此我们需要一个列表来跟踪这些信息,以便挑选出合适的。

再来看枚举类CXD3DEnum,它用来为应用程序中使用的分辨率,颜色,A通道,显示格式,后备缓冲格式,深度/模板缓冲格式,多重采样类型,提交显示时间间隔等参数建立约束。

文中枚举类的代码很多,但我们只需要记住一点就可以了,要使Direct3D建立起来,我们首先得不断地枚举,枚举,再枚举,不断检查它的各种属性,各种能力是否满足,基本上检查的顺序可以用下图来表示:

复制代码
Enumeration
|
+-- AdapterInfos[0]
| |
| +-- DisplayModes[0]
| +-- DisplayModes[1]
| |
| +-- DeviceInfos[0]
| | |
| | +-- DeviceCombos[0]
| | | |
| | | +-- VPTypes
| | | +-- DSFormats
| | | +-- MSTypes
| | | +-- MSQualityLevels
| | | +-- DSMSConflicts
| | | +-- PresentIntervals
| | +-- DeviceCombos[1]
| | 
| +-- DeviceInfos[1]
+-- AdapterInfos[1]

复制代码



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/07/08/1238479.html,如需转载请自行联系原作者
目录
相关文章
|
7月前
MFC消息映射机制
MFC消息映射机制
51 0
|
程序员 Windows
08 MFC - MFC框架中一些重要的函数
08 MFC - MFC框架中一些重要的函数
66 0
|
存储 API 数据库
【MFC】MFC基础篇(1)
【MFC】MFC基础篇(1)
【MFC】MFC基础篇(1)
|
Windows
《Windows 程序设计(第3版)》——第6章 框架中的窗口 6.1 CWnd类的引出
在类的体系结构中,框架程序提供了CWnd类来封装窗口的HWND句柄,即使用CWnd类来管理窗口的对象,这包括窗口的创建和销毁、窗口的一般行为和窗口所接受的消息。
1359 0
|
Windows
《Windows 程序设计(第3版)》——6.4 消息映射
在CMyWnd类中,OnCreate函数响应的是WM_CREATE消息,即当窗口接收到WM_CREATE消息以后,想让框架程序自动调用OnCreate函数。函数的名称是任意的,这里命名为OnCreate只是为了有意义。
1486 0
|
数据库
MFC中CFileDialog用法
<p style="margin: 10px auto; font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px;">用<span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14p
1488 0
C++MFC编程笔记day06 MFC向导、MFC绘图类使用
 MFC绘图    MFC绘图类包括绘图设备类和绘图对象类    1 绘图设备类      CDC类-父类是CObject,封装的是一般的绘图设备,例如:显示器,            打印机等。
1322 0
|
API C++ Windows
C++MFC编程笔记day02 MFC消息映射机制、菜单资源使用
机制3:MFC消息映射机制: 类内声明,类外定义宏,绑定消息处理函数派生自CCmdTarget类内声明宏:DECLARE_MESSAGE_MAP()类外添加实现宏:BEGIN_MESSAGE_MAP(类名,父类名)END_MESSAGE_MAP...
1183 0
|
C++ API 存储
C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理
一、MFC概念和作用 1、全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的执行流程MFC就是一个库(动态库,静态库)MFC还是一个程序框架 2、为什么使用MFC基于框架编程,提高工作效率,减少开发周期,节约开发成本。
1399 0