2012-10-12 29 views
1
// Draw a grid background. 
     int width = static_cast<int>(rtSize.width); 
     int height = static_cast<int>(rtSize.height); 

     for (int x = 0; x < width; x += 10) 
     { 
      m_pRenderTarget->DrawLine(
       D2D1::Point2F(static_cast<FLOAT>(x), 0.0f), 
       D2D1::Point2F(static_cast<FLOAT>(x), rtSize.height), 
       m_pLightSlateGrayBrush, 
       0.5f 
       ); 
     } 

這是本文檔中的示例。我已經包含「D2d1.h」,我只是不知道如何創建一個「m_pRenderTarget」。我正在寫一個Kinect項目,我想在圖像上畫一條線。我真的很新,請幫助我。如何在C++中使用DrawLine(DirectX圖形)

回答

1

您是否看到此頁面?

Create an ID2D1HwndRenderTarget

快速入門教程對如何使用Direct2D的一個具體步驟。

您也可以下載Windows SDK,樣品包含有如何創建的Direct2D渲染目標

我寫一個程序來繪製一個矩形,用少許變化充分步驟Direct2D的演示,它可以畫一條線,僅供參考

#include <windows.h> 
#include <D2D1.h> 

#define SAFE_RELEASE(P) if(P){P->Release() ; P = NULL ;} 

ID2D1Factory*   g_pD2DFactory = NULL; // Direct2D factory 
ID2D1HwndRenderTarget* g_pRenderTarget = NULL; // Render target 
ID2D1SolidColorBrush* g_pBlackBrush = NULL; // A black brush, reflect the line color 

VOID CreateD2DResource(HWND hWnd) 
{ 
    if (!g_pRenderTarget) 
    { 
     HRESULT hr ; 

     hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &g_pD2DFactory) ; 
     if (FAILED(hr)) 
     { 
      MessageBox(hWnd, "Create D2D factory failed!", "Error", 0) ; 
      return ; 
     } 

     // Obtain the size of the drawing area 
     RECT rc ; 
     GetClientRect(hWnd, &rc) ; 

     // Create a Direct2D render target 
     hr = g_pD2DFactory->CreateHwndRenderTarget(
      D2D1::RenderTargetProperties(), 
      D2D1::HwndRenderTargetProperties(
      hWnd, 
      D2D1::SizeU(rc.right - rc.left,rc.bottom - rc.top) 
      ), 
      &g_pRenderTarget 
      ) ; 
     if (FAILED(hr)) 
     { 
      MessageBox(hWnd, "Create render target failed!", "Error", 0) ; 
      return ; 
     } 

     // Create a brush 
     hr = g_pRenderTarget->CreateSolidColorBrush(
      D2D1::ColorF(D2D1::ColorF::Black), 
      &g_pBlackBrush 
      ) ; 
     if (FAILED(hr)) 
     { 
      MessageBox(hWnd, "Create brush failed!", "Error", 0) ; 
      return ; 
     } 
    } 
} 

VOID DrawLine(HWND hwnd) 
{ 
    CreateD2DResource(hwnd) ; 

    g_pRenderTarget->BeginDraw() ; 

    // Clear background color to White 
    g_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White)); 

    // Draw Rectangle 
    g_pRenderTarget->DrawLine(
     D2D1::Point2F(100.0f, 100.0f), 
     D2D1::Point2F(500.0f, 500.0f), 
     g_pBlackBrush 
     ); 

    HRESULT hr = g_pRenderTarget->EndDraw() ; 
    if (FAILED(hr)) 
    { 
     MessageBox(NULL, "Draw failed!", "Error", 0) ; 
     return ; 
    } 
} 


VOID Cleanup() 
{ 
    SAFE_RELEASE(g_pRenderTarget) ; 
    SAFE_RELEASE(g_pBlackBrush) ; 
    SAFE_RELEASE(g_pD2DFactory) ; 
} 

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message)  
    { 
    case WM_PAINT: 
     DrawLine(hwnd) ; 
     return 0 ; 

    case WM_KEYDOWN: 
     { 
      switch(wParam) 
      { 
      case VK_ESCAPE: 
       SendMessage(hwnd, WM_CLOSE, 0, 0); 
       break ; 
      default: 
       break ; 
      } 
     } 
     break ; 

    case WM_DESTROY: 
     Cleanup(); 
     PostQuitMessage(0); 
     return 0; 
    } 

    return DefWindowProc (hwnd, message, wParam, lParam) ; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) 
{ 

    WNDCLASSEX winClass ; 

    winClass.lpszClassName = "Direct2D"; 
    winClass.cbSize  = sizeof(WNDCLASSEX); 
    winClass.style   = CS_HREDRAW | CS_VREDRAW; 
    winClass.lpfnWndProc = WndProc; 
    winClass.hInstance  = hInstance; 
    winClass.hIcon   = NULL ; 
    winClass.hIconSm  = NULL ; 
    winClass.hCursor  = LoadCursor(NULL, IDC_ARROW); 
    winClass.hbrBackground = NULL ; 
    winClass.lpszMenuName = NULL; 
    winClass.cbClsExtra = 0; 
    winClass.cbWndExtra = 0; 

    if (!RegisterClassEx (&winClass)) 
    { 
     MessageBox (NULL, TEXT("This program requires Windows NT!"), "error", MB_ICONERROR) ; 
     return 0 ; 
    } 

    HWND hwnd = CreateWindowEx(NULL, 
     "Direct2D",     // window class name 
     "Draw Rectangle",   // window caption 
     WS_OVERLAPPEDWINDOW,  // window style 
     CW_USEDEFAULT,    // initial x position 
     CW_USEDEFAULT,    // initial y position 
     600,      // initial x size 
     600,      // initial y size 
     NULL,      // parent window handle 
     NULL,      // window menu handle 
     hInstance,     // program instance handle 
     NULL) ;      // creation parameters 

     ShowWindow (hwnd, iCmdShow) ; 
     UpdateWindow (hwnd) ; 

     MSG msg ; 
     ZeroMemory(&msg, sizeof(msg)) ; 

     while (GetMessage (&msg, NULL, 0, 0)) 
     { 
      TranslateMessage (&msg) ; 
      DispatchMessage (&msg) ; 
     } 

     return msg.wParam ; 
} 
+0

它說第一步是創建一個工廠。如下所示: 'ID2D1Factory * pD2DFactory = NULL; HRESULT hr = D2D1CreateFactory( D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory );' 但是我應該在哪裏創建它? – Miles

+0

我在前一篇文章中添加了一些代碼示例,你可以看看。 – zdd

+0

我做了類似的事情,但它不起作用,你知道爲什麼嗎? – Miles