原文地址:http://blog.youkuaiyun.com/rabbit729/article/details/6583871
使用DrawPrimitive()绘制的线没法控制其线性和绘制虚线,为此DirectX3D提供了ID3DXLine接口用来绘制线。该接口中的
HRESULT Draw(
CONST D3DXVECTOR2* pVertexList,
DWORD dwVertexListCount,
D3DCOLOR Color
);
方法中的pVertexList存放需要绘制顶点,他是以line strip的方式给出的,并且其中的点是屏幕坐标下的点。可以通过SetPattern()方法来控制绘制线的类型(虚线或者实线)。其他方法请参看MSDN中ID3DXLine的描述。
代码如下:
- /********************************
- * Author: rabbit729
- * E-mail: wlq_729@163.com
- * Date: 2011-07-04
- * Description: D3DXLine使用
- ********************************/
- #include <d3d9.h>
- #include <d3dx9.h>
- //-----------------------------------------------------------------------------
- // 全局变量
- //-----------------------------------------------------------------------------
- LPDIRECT3D9 g_pD3D = NULL; //Direct3D对象
- LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D设备对象
- LPD3DXLINE g_pLine = NULL; //Direct3D线对象
- D3DXVECTOR2* g_pLineArr = NULL; //线段顶点
- //-----------------------------------------------------------------------------
- // Desc: 初始化Direct3D
- //-----------------------------------------------------------------------------
- HRESULT InitD3D( HWND hWnd )
- {
- //创建Direct3D对象, 该对象用来创建Direct3D设备对象
- if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
- return E_FAIL;
- //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
- D3DPRESENT_PARAMETERS d3dpp;
- ZeroMemory( &d3dpp, sizeof(d3dpp) );
- d3dpp.Windowed = TRUE;
- d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
- //创建Direct3D设备对象
- if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING,
- &d3dpp, &g_pd3dDevice ) ) )
- {
- return E_FAIL;
- }
- // 创建Direct3D线对象
- if (FAILED(D3DXCreateLine(g_pd3dDevice, &g_pLine)))
- {
- return E_FAIL;
- }
- //填充线顶点,注意:线填充的都是屏幕坐标,不需要转换
- g_pLineArr = new D3DXVECTOR2[4];
- g_pLineArr[0].x = g_pLineArr[0].y = 50;
- g_pLineArr[1].x = 400;
- g_pLineArr[1].y = 50;
- g_pLineArr[2].x = 50;
- g_pLineArr[2].y = 400;
- g_pLineArr[3].x = 400;
- g_pLineArr[3].y = 400;
- return S_OK;
- }
- //-----------------------------------------------------------------------------
- // Desc: 释放创建对象
- //-----------------------------------------------------------------------------
- VOID Cleanup()
- {
- // 释放Line对象
- if (g_pLine != NULL)
- {
- g_pLine->Release();
- }
- //释放Direct3D设备对象
- if( g_pd3dDevice != NULL)
- g_pd3dDevice->Release();
- //释放Direct3D对象
- if( g_pD3D != NULL)
- g_pD3D->Release();
- }
- //-----------------------------------------------------------------------------
- // Desc: 渲染图形
- //-----------------------------------------------------------------------------
- VOID Render()
- {
- //清空后台缓冲区
- g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(43, 43, 43), 1.0f, 0 );
- //开始在后台缓冲区绘制图形
- if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
- {
- //绘制线
- g_pLine->SetWidth(3.f);
- g_pLine->SetAntialias(TRUE);
- g_pLine->Draw(g_pLineArr, 4, 0xffffffff);
- //结束在后台缓冲区渲染图形
- g_pd3dDevice->EndScene();
- }
- //将在后台缓冲区绘制的图形提交到前台缓冲区显示
- g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
- }
- //-----------------------------------------------------------------------------
- // Desc: 消息处理
- //-----------------------------------------------------------------------------
- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
- {
- switch( msg )
- {
- case WM_DESTROY:
- Cleanup();
- PostQuitMessage( 0 );
- return 0;
- case WM_PAINT:
- Render();
- ValidateRect( hWnd, NULL );
- return 0;
- }
- return DefWindowProc( hWnd, msg, wParam, lParam );
- }
- //-----------------------------------------------------------------------------
- // Desc: 程序入口
- //-----------------------------------------------------------------------------
- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
- {
- //注册窗口类
- WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
- GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
- L"ClassName", NULL };
- RegisterClassEx( &wc );
- //创建窗口
- HWND hWnd = CreateWindow( L"ClassName", L"Direct Line使用",
- WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,
- NULL, NULL, wc.hInstance, NULL );
- //初始化Direct3D
- if( SUCCEEDED( InitD3D( hWnd ) ) )
- {
- //显示主窗口
- ShowWindow( hWnd, SW_SHOWDEFAULT );
- UpdateWindow( hWnd );
- //进入消息循环
- MSG msg;
- ZeroMemory( &msg, sizeof(msg) );
- while( msg.message!=WM_QUIT )
- {
- if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
- {
- TranslateMessage( &msg );
- DispatchMessage( &msg );
- }
- else
- {
- Render(); //渲染图形
- }
- }
- }
- UnregisterClass( L"ClassName", wc.hInstance );
- return 0;
- }