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文件,在文件中添加如下代码。

  1. #include <windows.h>
  2. #include <D2D1.h>// header for Direct2D
  3.  
  4. #define SAFE_RELEASE(P) if(P){P->Release() ; P = NULL ;}
  5.  
  6. ID2D1Factory* pD2DFactory = NULL ; // Direct2D factory
  7. ID2D1HwndRenderTarget* pRenderTarget = NULL; // Render target
  8. ID2D1SolidColorBrush* pBlackBrush = NULL ; // A black brush, reflect the line color
  9.  
  10. RECT rc ; // Render area
  11. HWND g_Hwnd ; // Window handle
  12.  
  13. VOID CreateD2DResource(HWND hWnd)
  14. {
  15. if (!pRenderTarget)
  16. {
  17. HRESULT hr ;
  18.  
  19. hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory) ;
  20. if (FAILED(hr))
  21. {
  22. MessageBox(hWnd, "Create D2D factory failed!", "Error", ) ;
  23. return ;
  24. }
  25.  
  26. // Obtain the size of the drawing area
  27. GetClientRect(hWnd, &rc) ;
  28.  
  29. // Create a Direct2D render target
  30. hr = pD2DFactory->CreateHwndRenderTarget(
  31. D2D1::RenderTargetProperties(),
  32. D2D1::HwndRenderTargetProperties(
  33. hWnd,
  34. D2D1::SizeU(rc.right - rc.left,rc.bottom - rc.top)
  35. ),
  36. &pRenderTarget
  37. ) ;
  38. if (FAILED(hr))
  39. {
  40. MessageBox(hWnd, "Create render target failed!", "Error", ) ;
  41. return ;
  42. }
  43.  
  44. // Create a brush
  45. hr = pRenderTarget->CreateSolidColorBrush(
  46. D2D1::ColorF(D2D1::ColorF::Black),
  47. &pBlackBrush
  48. ) ;
  49. if (FAILED(hr))
  50. {
  51. MessageBox(hWnd, "Create brush failed!", "Error", ) ;
  52. return ;
  53. }
  54. }
  55. }
  56.  
  57. VOID DrawRectangle()
  58. {
  59. CreateD2DResource(g_Hwnd) ;
  60.  
  61. pRenderTarget->BeginDraw() ;
  62.  
  63. // Clear background color white
  64. pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
  65.  
  66. // Draw Rectangle
  67. pRenderTarget->DrawRectangle(
  68. D2D1::RectF(.f, .f, .f, .f),
  69. pBlackBrush
  70. );
  71.  
  72. HRESULT hr = pRenderTarget->EndDraw() ;
  73.  
  74. if (FAILED(hr))
  75. {
  76. MessageBox(NULL, "Draw failed!", "Error", ) ;
  77. return ;
  78. }
  79. }
  80.  
  81. VOID Cleanup()
  82. {
  83. SAFE_RELEASE(pRenderTarget) ;
  84. SAFE_RELEASE(pBlackBrush) ;
  85. SAFE_RELEASE(pD2DFactory) ;
  86. }
  87.  
  88. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  89. {
  90. switch (message)
  91. {
  92. case WM_PAINT:
  93. DrawRectangle() ;
  94. ValidateRect(g_Hwnd, NULL) ;
  95. return0 ;
  96.  
  97. case WM_KEYDOWN:
  98. {
  99. switch( wParam )
  100. {
  101. case VK_ESCAPE:
  102. SendMessage( hwnd, WM_CLOSE, , );
  103. break ;
  104. default:
  105. break ;
  106. }
  107. }
  108. break ;
  109.  
  110. case WM_DESTROY:
  111. Cleanup();
  112. PostQuitMessage( );
  113. return0;
  114. }
  115.  
  116. return DefWindowProc (hwnd, message, wParam, lParam) ;
  117. }
  118.  
  119. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
  120. {
  121.  
  122. WNDCLASSEX winClass ;
  123.  
  124. winClass.lpszClassName ="Direct2D";
  125. winClass.cbSize =sizeof(WNDCLASSEX);
  126. winClass.style = CS_HREDRAW | CS_VREDRAW;
  127. winClass.lpfnWndProc = WndProc;
  128. winClass.hInstance = hInstance;
  129. winClass.hIcon = NULL ;
  130. winClass.hIconSm = NULL ;
  131. winClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  132. winClass.hbrBackground = NULL ;
  133. winClass.lpszMenuName = NULL;
  134. winClass.cbClsExtra =;
  135. winClass.cbWndExtra =;
  136.  
  137. if (!RegisterClassEx (&winClass))
  138. {
  139. MessageBox ( NULL, TEXT( "This program requires Windows NT!" ), "error", MB_ICONERROR) ;
  140. return ;
  141. }
  142.  
  143. g_Hwnd = CreateWindowEx(NULL,
  144. "Direct2D", // window class name
  145. "Draw Rectangle", // window caption
  146. WS_OVERLAPPEDWINDOW, // window style
  147. CW_USEDEFAULT, // initial x position
  148. CW_USEDEFAULT, // initial y position
  149. , // initial x size
  150. , // initial y size
  151. NULL, // parent window handle
  152. NULL, // window menu handle
  153. hInstance, // program instance handle
  154. NULL) ; // creation parameters
  155.  
  156. ShowWindow (g_Hwnd, iCmdShow) ;
  157. UpdateWindow (g_Hwnd) ;
  158.  
  159. MSG msg ;
  160. ZeroMemory(&msg, sizeof(msg)) ;
  161.  
  162. while (GetMessage (&msg, NULL, , ))
  163. {
  164. TranslateMessage (&msg) ;
  165. DispatchMessage (&msg) ;
  166. }
  167.  
  168. return msg.wParam ;
  169. }

编译工程,可以在工程上单击右键,选择Build。运行程序,如果没有错误,你将会看到一个简单的矩形,至于详细原理,请看下一篇,Direct2D教程(三)来看Direct2D中的Hello World!

Hayyp Coding

== THE END ==

Direct2D教程(外篇)环境配置的更多相关文章

  1. Xamarin Anroid开发教程之验证环境配置是否正确

    Xamarin Anroid开发教程之验证环境配置是否正确 经过前面几节的内容已经把所有的编程环境设置完成了,但是如何才能确定所有的一切都处理争取并且没有任何错误呢?这就需要使用相应的实例来验证,本节 ...

  2. duilib教程之duilib入门简明教程2.VS环境配置

    既然是入门教程,那当然得基础点,因为搜索duilib相关资料时,发现有些小伙伴到处都是编译错误,以及路径配置错误等等,还有人不知道SVN,然后一个个文件手动下载的.    其实吧,duilib的定位好 ...

  3. QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置

    引言 24岁的某天,承载着周围人的关心,一路南下.天晴心静,听着斑马,不免对未来有些彷徨.但是呢,人生总要走陌生的路,看陌生的风景,所幸可以听着不变的歌,关心自己的人就那么多.就像是对庸常生活的一次越 ...

  4. Java基础教程1:环境配置及第一个HelloWorld.java

    本文主要介绍JDK环境配置.Sublime Text3配置及第一个HelloWorld.Java程序.运行环境为Win10系统,使用JDK1.8版本. 1. JDK下载及环境配置 1.1 JDK下载 ...

  5. [教程] Spring+Mybatis环境配置多数据源

    一.简要概述 在做项目的时候遇到需要从两个数据源获取数据,项目使用的Spring + Mybatis环境,看到网上有一些关于多数据源的配置,自己也整理学习一下,然后自动切换实现从不同的数据源获取数据功 ...

  6. Elasticsearch集群搭建教程及生产环境配置

    Elasticsearch 是一个极其强大的搜索和分析引擎,其强大的部分在于能够对其进行扩展以获得更好的性能和稳定性. 本教程将提供有关如何设置 Elasticsearch 集群的一些信息,并将添加一 ...

  7. IT兄弟连 Java语法教程 Java开发环境 配置Java环境变量

    在安装完JDK后,我们需要配置系统的环境变量,否则在控制台中使用JDK为我们提供的工具时将出现如图12所示的错误信息. 图12  未配置环境变量时执行java命令提示的错误信息 当出现这样的提示信息时 ...

  8. Angular7教程-01-Angular开发环境配置

    本教程基于angular7(2018-11-04) 1. 安装node.js 下载地址: http://nodejs.cn/download/ 下载对应自己操作系统的版本安装即可. 2.安装 angu ...

  9. JAVA复习2 JAVA开发环境配置

    我想写的东西主要是JAVA编程里的难点和易混淆点,所以在这里给大家提供一些经典的博客地址或网址.. W3C JAVA教程  JAVA开发环境配置篇: http://www.w3cschool.cc/j ...

  10. Java 环境配置 与 碰到的问题

    小白记录,希望各位指点,长期整理修改 不定期更新,碰到的与之相关的会添加,做个小笔记,再次碰到可以更好的解决. JDK 下载:Oracle 配置方法:菜鸟教程 - Java 开发环境配置 作用 JAV ...

随机推荐

  1. 《uml大战需求分析》阅读笔记05

    <uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...

  2. web工具网站等

    框架 1.handlebars http://handlebarsjs.com/ 2.http://underscorejs.org/#keys 3.http://stylus-lang.com/ 4 ...

  3. Python小练习五

    # 一个简单的数据库 # 字典使用人名作为键.每个人用另一个字典来表示,其键'phone'和'addr'分别表示它们的电话号码和地址. people = { 'Alice':{ ', 'addr': ...

  4. ES6详解

    1.ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. const声明常亮,不可改变 2.变量的解构赋值 (1)数组的解构赋值: 以前,为 ...

  5. UI线程和work线程

    UI线程处理消息,比如重绘,响应键盘鼠标等等跟消息有关的处理. 而工作线程一般是你自己写的用来处理数据的,比如操作数据库等等.(work线程)    

  6. Ansible常用模块

    http://liumissyou.blog.51cto.com/4828343/1749121

  7. SSE and Websocket

    http://www.w3school.com.cn/html5/html_5_serversentevents.asp http://javascript.ruanyifeng.com/htmlap ...

  8. 浅谈城市规划在移动GIS方面的应用发展

    1.概述 城市建设进程加快,城市规划管理工作日趋繁重,各种来源的数据产生各种层出不穷的问题,严重影响城市规划时的准确性,为此全面合理的掌握好各方面的城市规划资料才能做出更加科学的决策.移动端的兴起为规 ...

  9. IE11浏览器:请不要再叫我IE,谢谢

    这篇对自已挺有用的,特mark一下,纯转载. 转载自:nczonline 微软在上周刚刚发布了用于Windows 8.1上 的首个Internet Explorer 11的预览版.我们已经确认Inte ...

  10. Android ImageView高度根据图片比例自适应

    设置adjustViewBounds // 是否保持宽高比 <ImageView android:id="@+id/iv_test" android:layout_width ...