• Direct2D教程(外篇)环境配置


    2014年世界杯首场淘汰赛马上开始了,闲着没事,整理以前的博客草稿打发时间,意外的发现这篇文章,本来是打算加入到Direct2D那个系列的,不知道为什么把它给遗漏了。环境配置,对于熟手来说,不是什么重要的东西,但是对于新手却很重要,尤其是没有接触过Direct2D的朋友们,整理一下发了出来,没有放博客园首页。喜欢的来顶顶。

    引子

    上一篇鼓吹了一些关于D2D的东西,从这一篇开始说说如何使用D2D来编程,由于我自己也是从头开始摸索,所以就写得详细点,把如何创建工程的部分也写一下,这就是这篇的由来。本篇的主要内容包括,如何配置D2D开发环境,如何创建工程,添加必要的文件,编译工程等等。

    开发环境

    系统:Windows 7

    SDK:DirectX 11 SDK或者Windows SDK v7.1(含D2D Demo),推荐大家把两者都安装上。

    IDE:Visual Studio 2008或更高版本,在Windows上,VS是开发DX程序的不二之选。

    代码插件:Visual AssistX,这个东西必不可少,没有它,写C/C++代码很痛苦,现在我已经离不开它了。

    语言:C/C++混合。

    上面这些都可以在网上下载到,对于大多数开发者来说,我想Windows 7和VS应该已经具备了,只需要安装一下DX 11的SDK或者Windows SDK v7.1即可。对于仍然在使用XP系统的用户,非常抱歉,您只能观望了,因为Direct2D系统最低需求是Vista SP2。关于如何安装SDK,这里我就省略了。下面开始详细的步骤。

    创建工程

    打开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 ==

  • 相关阅读:
    通过SQLServer的数据库邮件来发送邮件
    sql生成数据库的序列号
    存储过程备份数据库
    LED客显的类
    坦克大战java版
    连连看java版
    贪吃蛇java版
    分享插件 javascript
    js实现上传图片及时预览
    json返回date类型转为字符串
  • 原文地址:https://www.cnblogs.com/graphics/p/1964256.html
Copyright © 2020-2023  润新知