#pragma once
#define UNICODE
//Direct3D lib
#include<d3d9.h>
#include<d3dx9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib") //Default lib
#include<wchar.h>
#include<tchar.h>
#include<assert.h>
#pragma comment(lib, "winmm.lib") namespace Clear
{
template<typename T>
void SafeRelease(T t)
{
if (t)
{
t->Release();
t = nullptr;
}
}
template<typename T>
void SafeDelete(T t)
{
if (t)
{
delete t;
t = nullptr;
}
}
}
class DXApp
{
public: DXApp(HINSTANCE hInstance = nullptr);
virtual ~DXApp(); bool InitDXApp(const WCHAR* title, UINT width, UINT height, bool fullscreen); bool InitWindow(const WCHAR* title, UINT width, UINT height, bool fullscreen);
bool InitDirect3D_9(); virtual LRESULT MsgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
virtual int Run();
void RenderShell();
virtual void Render() = ;
virtual void Update() = ;
virtual void OnLostDevice() = ;
virtual void OnResetDevice() = ; protected: HINSTANCE m_AppInstance;
HWND m_hWindowedHWND;
WCHAR m_strAppTitle[];
UINT m_windowWidth;
UINT m_windowHeight; bool m_bFullScreen;
bool m_bLostDevice; //Direct3D_9 properties
IDirect3D9* m_pD3D;
D3DPRESENT_PARAMETERS m_PresentParamenters;
IDirect3DDevice9* m_pD3Ddevice; };

DXApp.cpp

 #include "DXApp.h"

 //Store DXApp global pointer
namespace Global
{
DXApp* g_pDxapp = nullptr;
}
LRESULT CALLBACK MainProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
if (Global::g_pDxapp)
{
return Global::g_pDxapp->MsgProc(hWnd, Message, wParam, lParam);
}
else
{
return DefWindowProc(hWnd, Message, wParam, lParam);
}
} DXApp::DXApp(HINSTANCE hInstance)
{
m_AppInstance = hInstance;
m_hWindowedHWND = nullptr;
Global::g_pDxapp = this; } DXApp::~DXApp()
{
Clear::SafeRelease(m_pD3D);
Clear::SafeRelease(m_pD3Ddevice);
} bool DXApp::InitDXApp(const WCHAR* title, UINT width, UINT height, bool fullscreen)
{
if(!InitWindow(title, width, height, fullscreen))
return false;
if (!InitDirect3D_9())
return false; return true;
} bool DXApp::InitWindow(const WCHAR* title, UINT width, UINT height, bool fullscreen)
{
// Initialize window's properties
wsprintfW(m_strAppTitle, title);
m_windowWidth = width;
m_windowHeight = height;
m_bFullScreen = fullscreen;
m_bLostDevice = false; const WCHAR* CLASSNAME = L"DEMOCLASS";
WNDCLASSEX wcex;
ZeroMemory(&wcex, sizeof(wcex));
wcex.style = CS_VREDRAW | CS_HREDRAW;
wcex.cbClsExtra = ;
wcex.cbSize = sizeof(wcex);
wcex.cbWndExtra = ;
wcex.hbrBackground = nullptr;
wcex.hCursor = LoadCursor(m_AppInstance, IDC_ARROW);
wcex.hIcon = LoadIcon(m_AppInstance, IDI_APPLICATION);
wcex.hIconSm = LoadIcon(m_AppInstance, IDI_APPLICATION);
wcex.hInstance = m_AppInstance;
wcex.lpfnWndProc = MainProc;
wcex.lpszClassName = CLASSNAME;
wcex.lpszMenuName = nullptr;
if (!RegisterClassEx(&wcex))
{
OutputDebugString(L"DXApp::InitWindow: RegisterClassEx()failed!");
return false;
} // adjust window size
RECT adjR;
SetRect(&adjR, , , m_windowWidth, m_windowHeight);
AdjustWindowRect(&adjR, WS_OVERLAPPEDWINDOW, false);
UINT w = adjR.right - adjR.left;
UINT h = adjR.bottom - adjR.top;
UINT x = GetSystemMetrics(SM_CXSCREEN) / - w / ;
UINT y = GetSystemMetrics(SM_CYSCREEN) / - h / ;
m_hWindowedHWND = CreateWindow(CLASSNAME, m_strAppTitle, WS_OVERLAPPEDWINDOW, x, y, w, h, nullptr, nullptr, m_AppInstance, nullptr);
if (!m_hWindowedHWND)
{
OutputDebugString(L"DXApp::InitWindow: CreateWindow()failed!");
return false;
} ShowWindow(m_hWindowedHWND, SW_SHOWDEFAULT); return true;
} bool DXApp::InitDirect3D_9()
{
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION); D3DCAPS9 d3dcaps;
int vertex_proc = ;
m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dcaps);
if (d3dcaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vertex_proc = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
vertex_proc = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
} ZeroMemory(&m_PresentParamenters, sizeof(m_PresentParamenters));
m_PresentParamenters.BackBufferCount = ;
m_PresentParamenters.BackBufferWidth = m_windowWidth;
m_PresentParamenters.BackBufferHeight = m_windowHeight;
m_PresentParamenters.BackBufferFormat = D3DFMT_A8R8G8B8;
m_PresentParamenters.EnableAutoDepthStencil = true;
m_PresentParamenters.AutoDepthStencilFormat = D3DFMT_D24S8;
m_PresentParamenters.hDeviceWindow = m_hWindowedHWND;
m_PresentParamenters.Flags = ;
m_PresentParamenters.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_PresentParamenters.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
m_PresentParamenters.MultiSampleQuality = ;
m_PresentParamenters.MultiSampleType = D3DMULTISAMPLE_NONE;
m_PresentParamenters.Windowed = true;
m_PresentParamenters.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // create device
if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWindowedHWND, vertex_proc, &m_PresentParamenters, &m_pD3Ddevice)))
{
OutputDebugString(L"DXApp::InitDirect3D_9: CreateDevice()failed!");
return false;
} return true;
} LRESULT DXApp::MsgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
case WM_KEYDOWN:
if (wParam == VK_ESCAPE)
DestroyWindow(hWnd);
return ;
case WM_DESTROY:
PostQuitMessage();
return ;
} return DefWindowProc(hWnd, Message, wParam, lParam);
} int DXApp::Run()
{
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, nullptr, , , PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
RenderShell();
}
} return (int)msg.wParam;
} void DXApp::RenderShell()
{
if (m_bLostDevice)
{
HRESULT hr = m_pD3Ddevice->TestCooperativeLevel();
if (hr == D3DERR_DEVICELOST)
{
OnLostDevice();
return;
}
if (hr == D3DERR_DEVICENOTRESET)
{
m_pD3Ddevice->Reset(&m_PresentParamenters);
OnResetDevice();
return;
} m_bLostDevice = false;
}
m_pD3Ddevice->Clear(, nullptr, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(, , ), .f, 0L);
m_pD3Ddevice->BeginScene();
Update();
Render();
m_pD3Ddevice->EndScene();
HRESULT hr = m_pD3Ddevice->Present(, , , );
if (hr == D3DERR_DEVICELOST)
m_bLostDevice = true;
}

DirectX9完全面向对象框架的更多相关文章

  1. Web3D编程入门总结——面向对象的基础Web3D框架

    本篇主要通过分析Tony Parisi的sim.js库(原版代码托管于:https://github.com/tparisi/WebGLBook/tree/master/sim),总结基础Web3D框 ...

  2. Web三维编程入门总结之二:面向对象的基础Web3D框架

    本篇主要通过分析Tony Parisi的sim.js库(原版代码托管于:https://github.com/tparisi/WebGLBook/tree/master/sim),总结基础Web3D框 ...

  3. IOC框架

    一. IOC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...

  4. 产品前端重构(TypeScript、MVC框架设计)

    最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...

  5. 转:IOC框架

    CSND上看了王泽滨的博客关于IOC的,觉得说的很透彻,地址为:http://blog.csdn.net/wanghao72214/article/details/3969594 1 IoC理论的背景 ...

  6. 热门的PHP框架

    每个PHP框架都拥有各自独特的地方.同时PHP语言已经获得了巨大的认同并且成为了世界上最通用的服务器脚本语言.PHP也俨然成为了最容易学习的web动态开发语言.在PHP发展的同时,PHP框架也迅速崛起 ...

  7. [Spring框架]Spring IOC的原理及详解。

    这里感谢 CSDN 的原博客:http://blog.csdn.net/m13666368773/article/details/7802126 看后  受益匪浅,这里再重温一遍Spring IOC ...

  8. Ioc原理及常用框架

    1 IoC理论的背景    我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.  图1:软件系统中耦合的对象 如果我们 ...

  9. IoC框架(转载)

      1 IoC理论的背景    我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.  图1:软件系统中耦合的对象 如果 ...

随机推荐

  1. 【转载】手把手教你使用Git(简单,实用)

    手把手教你使用Git(简单,实用) 标签: git 2016年04月21日 20:51:45 1328人阅读 评论(0) 收藏 举报 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. ...

  2. 一、log4j日志框架的理论和不同场景使用

    1.日志框架: 工作中要进行Java输出日志时,你需要一个或者多个日志框架.框架能提供对象.方法和必要的配置来发送日志信息.Java语言本身有自带的日志实现包java.util.logging.还有很 ...

  3. Python 爬取 北京市政府首都之窗信件列表-[信息展示]

    日期:2020.01.25 博客期:133 星期六 [代码说明,如果要使用此页代码,必须在本博客页面评论区给予说明] //博客总体说明 1.准备工作 2.爬取工作 3.数据处理 4.信息展示(本期博客 ...

  4. keyup事件、keydown事件和input事件的区别

    keydown.keyup 属于键盘事件,input 属于文本事件 详细说明: keydown:当用户按下键盘上的任意按键时触发,如果按住不放,会重复触发此事件. keyup:当用户释放键盘上的按键时 ...

  5. css选择器优先级排序

    浏览器默认属性 < 继承自父元素的属性 < 通配符选择器 < 标签选择器 < 类选择器 < 结构伪类选择器 < id选择器 < 行内样式 < !impo ...

  6. Caffe2官方使用手册翻译

    详细教程见点击这里 http://www.jianshu.com/c/cf07b31bb5f2

  7. sqlplus 登陆使用

    select * from dept; input order by dname;  追加文本命令  del  n  删除语句 celar buffer ; 清除缓冲区的命令 conn sys as ...

  8. ROS学习笔记INF-重要操作列表

    该笔记将重要操作的步骤进行列表,以便查询: 添加消息 在包中的msg文件夹中创建msg文件 确保package.xml中的如下代码段被启用: <build_depend>message_g ...

  9. [c#]如何访问 JArray 的元素

    JArray 格式文件. public void TestJson() { var jsonString = @"{""trends"": [ { & ...

  10. java学习-循环结构-递归练习1-汉诺塔问题

    相传在印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到小按顺序放置64个金盘(如下图).游戏的目标:把A杆上的金盘全部移 ...