DirectX3D画线接口ID3DXLine

本文介绍如何使用DirectX3D中的ID3DXLine接口绘制实线和虚线。通过实例代码展示了创建Direct3D设备对象、初始化线对象、设置线属性及渲染线的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  原文地址: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的描述。

    

 

代码如下:

[cpp]  view plain copy
  1. /********************************   
  2. *  Author: rabbit729   
  3. *  E-mail: wlq_729@163.com   
  4. *  Date:   2011-07-04   
  5. *  Description: D3DXLine使用 
  6. ********************************/   
  7.   
  8. #include <d3d9.h>  
  9. #include <d3dx9.h>  
  10.   
  11. //-----------------------------------------------------------------------------  
  12. // 全局变量  
  13. //-----------------------------------------------------------------------------  
  14. LPDIRECT3D9             g_pD3D       = NULL; //Direct3D对象  
  15. LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; //Direct3D设备对象  
  16. LPD3DXLINE              g_pLine      = NULL; //Direct3D线对象  
  17. D3DXVECTOR2*            g_pLineArr   = NULL; //线段顶点   
  18.   
  19. //-----------------------------------------------------------------------------  
  20. // Desc: 初始化Direct3D  
  21. //-----------------------------------------------------------------------------  
  22. HRESULT InitD3D( HWND hWnd )  
  23. {  
  24.     //创建Direct3D对象, 该对象用来创建Direct3D设备对象  
  25.     if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )  
  26.         return E_FAIL;  
  27.   
  28.     //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象  
  29.     D3DPRESENT_PARAMETERS d3dpp;   
  30.     ZeroMemory( &d3dpp, sizeof(d3dpp) );  
  31.     d3dpp.Windowed = TRUE;  
  32.     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;  
  33.     d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;  
  34.   
  35.     //创建Direct3D设备对象  
  36.     if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,  
  37.                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,  
  38.                                       &d3dpp, &g_pd3dDevice ) ) )  
  39.     {  
  40.         return E_FAIL;  
  41.     }  
  42.   
  43.     // 创建Direct3D线对象  
  44.     if (FAILED(D3DXCreateLine(g_pd3dDevice, &g_pLine)))  
  45.     {  
  46.         return E_FAIL;  
  47.     }  
  48.   
  49.     //填充线顶点,注意:线填充的都是屏幕坐标,不需要转换  
  50.     g_pLineArr = new D3DXVECTOR2[4];  
  51.     g_pLineArr[0].x = g_pLineArr[0].y = 50;  
  52.     g_pLineArr[1].x = 400;  
  53.     g_pLineArr[1].y = 50;  
  54.     g_pLineArr[2].x = 50;  
  55.     g_pLineArr[2].y = 400;  
  56.     g_pLineArr[3].x = 400;  
  57.     g_pLineArr[3].y = 400;  
  58.   
  59.    return S_OK;  
  60. }  
  61.   
  62.   
  63. //-----------------------------------------------------------------------------  
  64. // Desc: 释放创建对象  
  65. //-----------------------------------------------------------------------------  
  66. VOID Cleanup()  
  67. {  
  68.     // 释放Line对象  
  69.     if (g_pLine != NULL)  
  70.     {  
  71.         g_pLine->Release();  
  72.     }  
  73.     //释放Direct3D设备对象  
  74.     if( g_pd3dDevice != NULL)   
  75.         g_pd3dDevice->Release();  
  76.   
  77.     //释放Direct3D对象  
  78.     if( g_pD3D != NULL)  
  79.         g_pD3D->Release();  
  80. }  
  81.   
  82.   
  83. //-----------------------------------------------------------------------------  
  84. // Desc: 渲染图形  
  85. //-----------------------------------------------------------------------------  
  86. VOID Render()  
  87. {  
  88.     //清空后台缓冲区  
  89.     g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(43, 43, 43), 1.0f, 0 );  
  90.       
  91.     //开始在后台缓冲区绘制图形  
  92.     if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )  
  93.     {  
  94.         //绘制线  
  95.         g_pLine->SetWidth(3.f);  
  96.         g_pLine->SetAntialias(TRUE);  
  97.         g_pLine->Draw(g_pLineArr, 4, 0xffffffff);  
  98.       
  99.         //结束在后台缓冲区渲染图形  
  100.         g_pd3dDevice->EndScene();  
  101.     }  
  102.   
  103.     //将在后台缓冲区绘制的图形提交到前台缓冲区显示  
  104.     g_pd3dDevice->Present( NULL, NULL, NULL, NULL );  
  105. }  
  106.   
  107.   
  108. //-----------------------------------------------------------------------------  
  109. // Desc: 消息处理  
  110. //-----------------------------------------------------------------------------  
  111. LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )  
  112. {  
  113.     switch( msg )  
  114.     {  
  115.         case WM_DESTROY:  
  116.             Cleanup();  
  117.             PostQuitMessage( 0 );  
  118.             return 0;  
  119.   
  120.         case WM_PAINT:  
  121.             Render();  
  122.             ValidateRect( hWnd, NULL );  
  123.             return 0;  
  124.     }  
  125.   
  126.     return DefWindowProc( hWnd, msg, wParam, lParam );  
  127. }  
  128.   
  129.   
  130. //-----------------------------------------------------------------------------  
  131. // Desc: 程序入口  
  132. //-----------------------------------------------------------------------------  
  133. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCELPSTRINT )  
  134. {  
  135.     //注册窗口类  
  136.     WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,   
  137.                       GetModuleHandle(NULL), NULL, NULL, NULL, NULL,  
  138.                       L"ClassName", NULL };  
  139.     RegisterClassEx( &wc );  
  140.   
  141.     //创建窗口  
  142.     HWND hWnd = CreateWindow( L"ClassName", L"Direct Line使用",   
  143.                               WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,  
  144.                               NULL, NULL, wc.hInstance, NULL );  
  145.   
  146.     //初始化Direct3D  
  147.     if( SUCCEEDED( InitD3D( hWnd ) ) )  
  148.     {   
  149.         //显示主窗口  
  150.         ShowWindow( hWnd, SW_SHOWDEFAULT );  
  151.         UpdateWindow( hWnd );  
  152.   
  153.         //进入消息循环  
  154.         MSG msg;  
  155.         ZeroMemory( &msg, sizeof(msg) );  
  156.         while( msg.message!=WM_QUIT )  
  157.         {  
  158.             if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )  
  159.             {  
  160.                 TranslateMessage( &msg );  
  161.                 DispatchMessage( &msg );  
  162.             }  
  163.             else  
  164.             {  
  165.                 Render();  //渲染图形  
  166.             }  
  167.         }  
  168.     }  
  169.   
  170.     UnregisterClass( L"ClassName", wc.hInstance );  
  171.     return 0;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值