最近一直接触的都是C#的东东,好久没写C++代码了,怕手生忘记了,打算写写C++的代码。写什么好呢?想来想去,以前的工作学过接触了些OpenGL,那我就学习一下D3D吧。原以为D3D的中文入门资料会很多的,结果找了半天也没找到合适的。哎,随便将就着学吧。
既然是来兴趣学一下,我可不想去下个超大的DirectX安装包,所以首先,当然得找到lib库和头文件啦,我在GameRes游戏开发资源网上找到了,只有3.2M,呵呵,够小吧。地址如下:
DirectX9.0C SDK library
下载下来解压后,假设解压到d:/codelib/dx9csdk下吧, 首先得把INC和lib目录加到VC的搜索路径上去。
我用VS2005, 选择菜单Tools - Option - Projects and Solutions - VC++ Directories
如图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zxcred/EntryImages/20081007/Inc1.PNG)
然后,接下来就可以开始写代码了。
我们采用Win32API来创建窗口,为了重用代码,创建窗口使用了我博客里介绍的一个类KWindow,请见:
一个基于Win32的完全面向对象的窗口类
我们新建一个类,叫做KD3DWindow把,从KWindow继承。
其UML图如下所示:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zxcred/EntryImages/20081008/ClassUML.jpg)
KWindow的内容请看我博客上的前一篇文章吧。
KD3DWindow.h的内容如下所示:
- #include "KWindow.h"
- #include <D3D8.H>
- #pragma comment(lib, "D3d8.lib") //链接库
-
class KD3DWindow : public KWindow
- {
-
private:
- void OnKeyDown(WPARAM wParam, LPARAM lParam);
- void OnDraw(HDC hDC);
- void GetWndClassEx(WNDCLASSEX & wc);
-
- //D3D相关
- void Render();
- void Cleanup();
- HRESULT InitD3D( HWND hWnd );
-
public:
- KD3DWindow();
- ~KD3DWindow();
- virtual bool CreateEx(DWORD dwExStyle,
- LPCTSTR lpszClass, LPCTSTR lpszName, DWORD dwStyle,
- int x, int y, int nWidth, int nHeight, HWND hParent,
- HMENU hMenu, HINSTANCE hInst);
-
private:
- LPDIRECT3D8 g_pD3D ; // 用来创建D3D设备
- LPDIRECT3DDEVICE8 g_pd3dDevice ; // D3D设备
- };
KD3DWindow.cpp内容如下:
- // KD3DWindow.cpp: implementation of the KD3DWindow class.
- //
- //
- #include "stdafx.h"
- #include "KD3DWindow.h"
- //
- // Construction/Destruction
- //
- #include <windows.h>
- #include <assert.h>
- #include <tchar.h>
- #include "KWindow.h"
-
const TCHAR szHint[] = _T("Press ESC to quit.");
-
void KD3DWindow::GetWndClassEx( WNDCLASSEX & wc )
- {
- memset(& wc, 0, sizeof(wc));
-
- wc.cbSize = sizeof(WNDCLASSEX);
- wc.style = 0;
- wc.lpfnWndProc = WindowProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = NULL;
- wc.hIcon = NULL;
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
- wc.lpszMenuName = NULL;
- wc.lpszClassName = NULL;
- wc.hIconSm = NULL;
- }
-
void KD3DWindow::OnDraw( HDC hDC )
- {
- //先用D3D设备渲染
- Render();
- //用Windows API在屏幕上绘图
- TextOut(hDC, 0, 0, szHint, lstrlen(szHint));
- }
-
void KD3DWindow::OnKeyDown( WPARAM wParam, LPARAM lParam )
- {
- if (wParam==VK_ESCAPE )
- {
- PostMessage(m_hWnd, WM_CLOSE, 0, 0);
- }
- }
- // 初始化D3D
-
HRESULT KD3DWindow::InitD3D( HWND hWnd )
- {
- //如果还没有窗口,返回失败啦
- if( m_hWnd == NULL)
- return E_FAIL;
- // 创建D3D对象
- if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
- return E_FAIL;
- // 获取当前的显示模式
- D3DDISPLAYMODE d3ddm;
- if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
- return E_FAIL;
- D3DPRESENT_PARAMETERS d3dpp;
- ZeroMemory( &d3dpp, sizeof(d3dpp) );
- d3dpp.Windowed = TRUE; // 窗口模式
- d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 设置交换模式
- d3dpp.BackBufferFormat = d3ddm.Format; // 设置背景缓冲区格式为当前左面格式
- // 创建D3D设备
- // 第一个参数:使用默认的显卡
- // 第二个参数:请求使用硬件抽象层(HAL)
- // 第三个参数:窗口句柄
- // 第四个参数:使用软件处理顶点
- // 第五个参数:创建的参数
- // 第六个参数:创建的D3D设备指针
- if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
- D3DDEVTYPE_HAL,
- hWnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING,
- &d3dpp,
- &g_pd3dDevice ) ) )
- {
- return E_FAIL;
- }
- return S_OK;
- }
- // 释放D3D
-
void KD3DWindow::Cleanup()
- {
- if( g_pd3dDevice != NULL)
- g_pd3dDevice->Release();
- if( g_pD3D != NULL)
- g_pD3D->Release();
- }
- // 渲染
-
void KD3DWindow::Render()
- {
- if( NULL == g_pd3dDevice )
- return;
- // 清除背景为兰色
- g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
- // 绘制场景
- g_pd3dDevice->BeginScene();
- // 这里绘制你需要的东西
- // 结束绘制
- g_pd3dDevice->EndScene();
- // 显示到屏幕上
- g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
- }
- KD3DWindow::KD3DWindow()
- {
- }
- KD3DWindow::~KD3DWindow()
- {
- Cleanup();
- }
-
bool KD3DWindow::CreateEx(DWORD dwExStyle,
- LPCTSTR lpszClass, LPCTSTR lpszName, DWORD dwStyle,
- int x, int y, int nWidth, int nHeight, HWND hParent,
- HMENU hMenu, HINSTANCE hInst)
- {
- //创建窗口
- bool bRet = KWindow::CreateEx(dwExStyle,lpszClass,lpszName,dwStyle,x,y,nWidth,nHeight,hParent,hMenu,hInst);
- //初始化D3D设备
- if( InitD3D(m_hWnd) != S_OK)
- bRet = false;
- return bRet;
- }
代码关键地方都有注释,也很好理解的。
然后就是主函数如何调用了,请看:
-
int APIENTRY WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow)
- {
- // TODO: Place code here.
- KD3DWindow win;
- //KHelloWindow win;
- win.CreateEx(0, _T("Hello"), _T("Hello"), WS_OVERLAPPEDWINDOW, GetSystemMetrics(SM_CXSCREEN)/4, GetSystemMetrics(SM_CYSCREEN)/4,
- GetSystemMetrics(SM_CXSCREEN)/2,
- GetSystemMetrics(SM_CYSCREEN)/2,
- NULL, NULL, hInstance);
- win.ShowWindow(nCmdShow);
- win.UpdateWindow();
- return win.MessageLoop();
- }
编译运行后,可以看到程序既有D3D渲染的背景场景,也有Win32 GDI绘制的文字。如下所示:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/zxcred/EntryImages/20081008/InitD3D.PNG)
本文来自
http://blog.csdn.net/zxcred