Direct2D教程(外篇)環境配置

2014年世界盃首場淘汰賽立刻開始了,閒着沒事,整理之前的博客草稿打發時間,意外的發現這篇文章,原本是打算加入到Direct2D那個系列的,不知道爲何把它給遺漏了。環境配置,對於熟手來講,不是什麼重要的東西,可是對於新手卻很重要,尤爲是沒有接觸過Direct2D的朋友們,整理一下發了出來,沒有放博客園首頁。喜歡的來頂頂。編程

引子

上一篇鼓吹了一些關於D2D的東西,從這一篇開始說說如何使用D2D來編程,因爲我本身也是從頭開始摸索,因此就寫得詳細點,把如何建立工程的部分也寫一下,這就是這篇的由來。本篇的主要內容包括,如何配置D2D開發環境,如何建立工程,添加必要的文件,編譯工程等等。windows

開發環境

系統:Windows 7app

SDK:DirectX 11 SDK或者Windows SDK v7.1(含D2D Demo),推薦你們把二者都安裝上。ui

IDE:Visual Studio 2008或更高版本,在Windows上,VS是開發DX程序的不二之選。spa

代碼插件:Visual AssistX,這個東西必不可少,沒有它,寫C/C++代碼很痛苦,如今我已經離不開它了。插件

語言:C/C++混合。code

上面這些均可以在網上下載到,對於大多數開發者來講,我想Windows 7和VS應該已經具有了,只須要安裝一下DX 11的SDK或者Windows SDK v7.1便可。對於仍然在使用XP系統的用戶,很是抱歉,您只能觀望了,由於Direct2D系統最低需求是Vista SP2。關於如何安裝SDK,這裏我就省略了。下面開始詳細的步驟。blog

建立工程

打開Visual Studio,選擇File-New-Project,彈出以下對話框教程

在對話框的左側,Project typeset中選擇Visual C++,在對話框的右邊,Templates中選擇Win32 Project,在Name欄填上工程的名字D2DApp,Location欄填上工程所在的路徑,最後在Solution Name中填上整個解決方案的名字D2DSolution,由於任何一個工程都隸屬於一個解決方案(Solution)。單擊OK按鈕,彈出以下對話框。開發

這個對話框中沒有任何設置,直接單擊Next按鈕,來到以下對話框。

在Application type中選擇Windows application(其實默認已經選好),在Additional option中選擇Empty project。單擊Finish按鈕,好了,工程建立完畢,但只不過是空的而已,還需添加一些東西。回到Visual Studio主界面,單擊菜單欄上的View,選擇Solution explorer,在其中能夠看到咱們剛剛創建的工程。

在Solution Explorer中,右鍵單擊工程D2DApp,選擇Add-New Item,在Categories中選擇Visual C++,在Templates中選擇C++ File(.cpp),在Name欄中給文件取個名字,好比Main。而後單擊Add按鈕。這樣文件就添加到工程中了,只不過是個空文件,待咱們配置好頭文件和lib文件後,再往這個文件裏面加東西。

配置頭文件和庫文件路徑

基於單個工程的設置

在工程上單擊右鍵,選擇Properties,在彈出的對話框中依次選擇Configuration Properties-C/C++-General,在右側窗口中第一行Additional Include Directories右邊有一個帶省略號的小按鈕,單擊該按鈕添,在彈出的對話框上點擊新建文件夾的按鈕,而後點擊下拉框右側的按鈕來添加頭文件路徑,以下圖

如法炮製,配置.lib文件,不贅述,直接上圖

基於全部工程的配置

上面的方法只是針對單個工程,也就是說,每建立一個Direct2D程序時,都要按照上面的步驟作一次,若是想避免這個麻煩,那麼能夠針對全部工程進行設置,這樣之後建立的工程都應用這個配置。豈不哉?

在VS菜單欄上選擇Tools-Options,在彈出的對話框中選擇Projects and Solutions-VC++ Directories,在右側的Show Directories for下拉框中選擇Include Files,單擊下面的New Line按鈕,添加頭文件路徑,在下拉框中選擇Libraries files添加庫文件路徑。最後單擊OK便可。

添加頭文件和庫文件

D2D程序最經常使用的庫文件就是D2D1.lib,經過下圖所示方法將其加入到工程之中,最經常使用的頭文件是D2D1.h,直接寫到程序代碼中便可。

編譯工程

雙擊工程中的Main.cpp文件,在文件中添加以下代碼。

#include <windows.h>
#include <D2D1.h>// header for Direct2D

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

ID2D1Factory* pD2DFactory = NULL ; // Direct2D factory
ID2D1HwndRenderTarget* pRenderTarget = NULL; // Render target
ID2D1SolidColorBrush* pBlackBrush = NULL ; // A black brush, reflect the line color

RECT rc ; // Render area
HWND g_Hwnd ; // Window handle

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

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

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

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

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

VOID DrawRectangle()
{
    CreateD2DResource(g_Hwnd) ;

    pRenderTarget->BeginDraw() ;

    // Clear background color white
    pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));

    // Draw Rectangle
    pRenderTarget->DrawRectangle(
        D2D1::RectF(100.f, 100.f, 500.f, 500.f),
        pBlackBrush
        );

    HRESULT hr = pRenderTarget->EndDraw() ;

    if (FAILED(hr))
    {
        MessageBox(NULL, "Draw failed!", "Error", 0) ;
        return ;
    }
}

VOID Cleanup()
{
    SAFE_RELEASE(pRenderTarget) ;
    SAFE_RELEASE(pBlackBrush) ;
    SAFE_RELEASE(pD2DFactory) ;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{
    switch (message) 
    {
    case WM_PAINT:
        DrawRectangle() ;
        ValidateRect(g_Hwnd, NULL) ;
        return0 ;

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

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

    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 ; 
    } 

    g_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 (g_Hwnd, iCmdShow) ;
    UpdateWindow (g_Hwnd) ;

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

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

    return msg.wParam ;
}

編譯工程,能夠在工程上單擊右鍵,選擇Build。運行程序,若是沒有錯誤,你將會看到一個簡單的矩形,至於詳細原理,請看下一篇,Direct2D教程(三)來看Direct2D中的Hello World!

Hayyp Coding

== THE END ==

相關文章
相關標籤/搜索