第一个D2D程序运行及配置

1.为啥要加头文件和库文件?

.h头文件只是函数的声明。

.lib才是函数实现的地方。

只不过,如果你加载的是系统头文件,默认会帮你加上.lib文件。
如果如时是你自己写的函数,就要手动添加.lib文件了
dll是动态链接,lib是静态链接。
你自己写的函数一般都包括.h头文件,.cpp实现文件。
但是别人一般不会把源代码一块给你,只给你一个.lib文件
你可以把.lib文件理解成编译好的.cpp文件。

先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终的EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。

采用动态链接库的优点:(1)更加节省内存;(2)DLL文件与EXE文件独立,只要输出接口不变,更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性。

动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的EXE文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。
静态链接的执行程序能够在其它同类操作系统的机器上直接运行,比如一个EXE文件是在WIN2000系统上静态链接的,那么将该文件直接拷贝到另一台WIN2000的机器上,是可以运行的。
而动态链接的执行程序则不可以,除非把该EXE文件所需的DLL文件都一并拷贝过去,或者对方机器上也有所需的相同版本的DLL文件,否则是不能保证正常运行的。
不过静态链接得到的文件比较大,而动态链接得到的文件比较小。

2.怎么配置头文件和库文件?


怎么一次修改配置,而不是每次新建程序修改?


视图-》其他窗口-》属性管理器->点那个项目->点Debug|Win32->点Microsoft.Cpp.Win32.user


在VC++目录里-》包含目录里,加入include路径里的头文件
在VC+=目录里的库目录里加入lib文件夹路径
在链接器 的输入里加入d2d1.lib
 
  

3.新建一个D2D程序

接下来在VS中创建一个win32项目(注意不要建错),要建立空项目,此处一个样例代码是建立一个sin移动的矩形
 
  
  1. /*************************************************************** 
  2. 功能:简单的D2D窗口创建、矩形的sin曲线移动 
  3. 作者:*** 
  4. 版本:1.0 
  5. 日期:2016.4 
  6. ****************************************************************/  
  7. #include   
  8. #include  
  9. #include  
  10.   
  11. //函数声明  
  12. void CreateResource();  
  13.   
  14. //变量声明  
  15. ID2D1Factory *pFactory = NULL;  
  16. ID2D1HwndRenderTarget *pRenderTarget = NULL;  
  17. ID2D1SolidColorBrush *pBrush = NULL;  
  18.   
  19. HWND hwnd = 0;  
  20. RECT rt = { 0 }, rtClient = { 0 };  
  21. int num = 1;  
  22.   
  23. void init()  
  24. {  
  25.     if (!hwnd)  
  26.     {  
  27.         return;  
  28.     }  
  29.     GetClientRect(hwnd, &rtClient);  
  30.     CreateResource();  
  31. }  
  32.   
  33. void CreateResource()  
  34. {  
  35.     HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);  
  36.     if (SUCCEEDED(hr))  
  37.     {  
  38.         hr = pFactory->CreateHwndRenderTarget(  
  39.             D2D1::RenderTargetProperties(),  
  40.             D2D1::HwndRenderTargetProperties(  
  41.             hwnd,  
  42.             D2D1::SizeU(  
  43.             rtClient.right - rtClient.left,  
  44.             rtClient.bottom - rtClient.top)),  
  45.             &pRenderTarget);  
  46.         if (SUCCEEDED(hr))  
  47.         {  
  48.             hr = pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red), &pBrush);  
  49.             if (FAILED(hr))  
  50.             {  
  51.                 MessageBox(hwnd, TEXT("Create Resource Fail!"), TEXT("Error"), MB_OK);  
  52.                 return;  
  53.             }  
  54.         }  
  55.     }  
  56. }  
  57. void DrawRectangle()  
  58. {  
  59.     if (pRenderTarget){  
  60.         pRenderTarget->BeginDraw();  
  61.         pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::Black));  
  62.         pRenderTarget->DrawRectangle(D2D1::RectF(rt.left + 0.0f, rt.top + 200.0f, rt.right + 50.0f, rt.bottom + 250.0f), pBrush);  
  63.         pRenderTarget->EndDraw();  
  64.     }  
  65. }  
  66. void Render()  
  67. {  
  68.     DrawRectangle();  
  69.     num += 5;  
  70.     rt.right += 2;  
  71.     rt.left += 2;  
  72.     rt.top = (100 * sin(num * 3.14 / 180));  
  73.     rt.bottom = (100 * sin(num * 3.14 / 180));  
  74.     if (rt.right == 1000)  
  75.     {  
  76.         rt = { 0 };  //这句有点问题去掉仍可正常运行
  77.         num = 0;  
  78.     }  
  79. }  
  80.   
  81. template<class Interface>  
  82. inline void SafeRelease(Interface **ppinterfaceToRelease)  
  83. {  
  84.     if (NULL != *ppinterfaceToRelease)  
  85.     {  
  86.         (*ppinterfaceToRelease)->Release();  
  87.         (*ppinterfaceToRelease) = NULL;  
  88.     }  
  89. }  
  90. void CleanUp()  
  91. {  
  92.     SafeRelease(&pBrush);  
  93.     SafeRelease(&pRenderTarget);  
  94.     SafeRelease(&pFactory);  
  95. }  
  96.   
  97. LRESULT CALLBACK WndProc(HWND Hwnd, UINT message, WPARAM wParam, LPARAM iParam);  
  98. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)  
  99. {  
  100.     MSG Msg;  
  101.     WNDCLASS wndclass;  
  102.     TCHAR lpszTitle[] = TEXT("MyDemo001");  
  103.   
  104.     wndclass.style = CS_HREDRAW|CS_VREDRAW;  
  105.     wndclass.lpfnWndProc = WndProc;  
  106.     wndclass.cbClsExtra = 0;  
  107.     wndclass.cbWndExtra = 0;  
  108.     wndclass.hInstance = hInstance;  
  109.     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);  
  110.     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);  
  111.     wndclass.lpszMenuName = NULL;  
  112.     wndclass.lpszClassName = TEXT("MyClass");  
  113.     wndclass.hbrBackground = 0;  
  114.     if (!RegisterClass(&wndclass))  
  115.     {  
  116.         MessageBox(NULL, TEXT("RegisterClass fail!"), TEXT("error"), MB_ICONERROR);  
  117.         return 0;  
  118.     }  
  119.   
  120.     hwnd = CreateWindow(  
  121.         TEXT("MyClass"),  
  122.         lpszTitle,  
  123.         WS_OVERLAPPEDWINDOW,  
  124.         CW_USEDEFAULT,  
  125.         CW_USEDEFAULT,  
  126.         CW_USEDEFAULT,  
  127.         CW_USEDEFAULT,  
  128.         NULL,  
  129.         NULL,  
  130.         hInstance,  
  131.         NULL);  
  132.     ShowWindow(hwnd, nCmdShow);  
  133.     UpdateWindow(hwnd);  
  134.     init();  
  135.   
  136.     BOOL bRet;  
  137.     PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE);  
  138.     while (Msg.message != WM_QUIT)  
  139.     {  
  140.         bRet = PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE);  
  141.         if (bRet)  
  142.         {  
  143.             TranslateMessage(&Msg);  
  144.             DispatchMessage(&Msg);  
  145.         }  
  146.         else  
  147.         {  
  148.             Render();  
  149.         }  
  150.     }  
  151.     CleanUp();  
  152.     return Msg.wParam;  
  153. }  
  154.   
  155. LRESULT CALLBACK WndProc(HWND Hwnd, UINT message, WPARAM wParam, LPARAM iParam)  
  156. {  
  157.     switch (message)  
  158.     {  
  159.     case WM_DESTROY:  
  160.         PostQuitMessage(0);  
  161.         return 0;  
  162.     }  
  163.     return DefWindowProc(Hwnd, message, wParam, iParam);  
  164. }  

你可能感兴趣的:(D2D)