当前位置:   article > 正文

D3D初学入门一(配置开发环境及绘制D3D窗口)_d3d8 创建窗口

d3d8 创建窗口

  最近一直接触的都是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

  如图:

  

  然后,接下来就可以开始写代码了。

  我们采用Win32API来创建窗口,为了重用代码,创建窗口使用了我博客里介绍的一个类KWindow,请见:

  一个基于Win32的完全面向对象的窗口类

  我们新建一个类,叫做KD3DWindow把,从KWindow继承。

  其UML图如下所示:

  KWindow的内容请看我博客上的前一篇文章吧。

  KD3DWindow.h的内容如下所示:

  1. #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内容如下:

  1. // 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, 00, szHint, lstrlen(szHint));}void KD3DWindow::OnKeyDown( WPARAM wParam, LPARAM lParam ){    if (wParam==VK_ESCAPE )    {        PostMessage(m_hWnd, WM_CLOSE00);    }}// 初始化D3DHRESULT KD3DWindow::InitD3D( HWND hWnd ){    //如果还没有窗口,返回失败啦    if( m_hWnd == NULL)        return E_FAIL;    // 创建D3D对象    ifNULL == ( g_pD3= 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;}// 释放D3Dvoid KD3DWindow::Cleanup(){    if( g_pd3dDevice != NULL)         g_pd3dDevice->Release();    if( g_pD3D != NULL)        g_pD3D->Release();}// 渲染void KD3DWindow::Render(){    ifNULL == g_pd3dDevice )        return;    // 清除背景为兰色    g_pd3dDevice->Clear( 0NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );    // 绘制场景    g_pd3dDevice->BeginScene();    // 这里绘制你需要的东西    // 结束绘制    g_pd3dDevice->EndScene();    // 显示到屏幕上    g_pd3dDevice->PresentNULLNULLNULLNULL );}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;}

  代码关键地方都有注释,也很好理解的。

  然后就是主函数如何调用了,请看:

  1. 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,        NULLNULL, hInstance);    win.ShowWindow(nCmdShow);    win.UpdateWindow();    return win.MessageLoop();}

  编译运行后,可以看到程序既有D3D渲染的背景场景,也有Win32 GDI绘制的文字。如下所示:

本文来自
http://blog.csdn.net/zxcred

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/121313
推荐阅读
相关标签
  

闽ICP备14008679号