我们来创建我们的第一个Direct2D程序。这个程序并没有什么特别之处——它只是绘制一个填满窗口客户区域的圆圈。但是这个程序引入了许多重要的Direct2D概念。

Circle程序的屏幕截图。

这是Circle程序的代码清单。该程序重新使用在管理应用程序状态主题中定义的BaseWindow类。稍后的主题将详细检查代码。

#include<windows.h>
#include<d2d1.h>
#pragma comment(lib, "d2d1")
#include"basewin.h"
template<class T>
void SafeRelease(T **ppT){if(*ppT){(*ppT)->Release();*ppT=NULL;}
}
class MainWindow:public BaseWindow<MainWindow>{ID2D1Factory *pFactory;ID2D1HwndRenderTarget *pRenderTarget;ID2D1SolidColorBrush *pBrush;D2D1_ELLIPSE ellipse;void CalculateLayout();HRESULT CreateGraphicsResources();void DiscardGraphicsResources();void OnPaint();void Resize();public:MainWindow():pFactory(NULL),pRenderTarget(NULL),pBrush(NULL){}PCWSTR ClassName()const{return L"Circle Window Class";}LRESULT HandleMessage(UINT uMsg,WPARAM wParam,LPARAM lParam);
};
// Recalculate drawing layout when the size of the window changes.
void MainWindow::CalculateLayout(){if(pRenderTarget!=NULL){D2D1_SIZE_F size=pRenderTarget->GetSize();const float x=size.width/2;const float y=size.height/2;const float radius=min(x,y);ellipse=D2D1::Ellipse(D2D1::Point2F(x,y),radius,radius);}
}
HRESULT MainWindow::CreateGraphicsResources(){HRESULT hr=S_OK;if(pRenderTarget==NULL){RECT rc;GetClientRect(m_hwnd,&rc);D2D1_SIZE_U size=D2D1::SizeU(rc.right,rc.bottom);hr=pFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),D2D1::HwndRenderTargetProperties(m_hwnd,size),&pRenderTarget);if(SUCCEEDED(hr)){const D2D1_COLOR_F color=D2D1::ColorF(1.0f,1.0f,0);hr=pRenderTarget->CreateSolidColorBrush(color,&pBrush);if(SUCCEEDED(hr))CalculateLayout();}}return hr;
}
void MainWindow::DiscardGraphicsResources(){SafeRelease(&pRenderTarget);SafeRelease(&pBrush);
}
void MainWindow::OnPaint(){HRESULT hr=CreateGraphicsResources();if(SUCCEEDED(hr)){PAINTSTRUCT ps;BeginPaint(m_hwnd,&ps);pRenderTarget->BeginDraw();pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::SkyBlue));pRenderTarget->FillEllipse(ellipse,pBrush);hr=pRenderTarget->EndDraw();if(FAILED(hr)||hr==D2DERR_RECREATE_TARGET)DiscardGraphicsResources();EndPaint(m_hwnd,&ps);}
}
void MainWindow::Resize(){if(pRenderTarget!=NULL){RECT rc;GetClientRect(m_hwnd,&rc);D2D1_SIZE_U size=D2D1::SizeU(rc.right,rc.bottom);pRenderTarget->Resize(size);CalculateLayout();InvalidateRect(m_hwnd,NULL,FALSE);}
}
int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE,PWSTR,int nCmdShow){MainWindow win;if(!win.Create(L"Circle",WS_OVERLAPPEDWINDOW))return 0;ShowWindow(win.Window(),nCmdShow);// Run the message loop.MSG msg={};while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0;
}
LRESULT MainWindow::HandleMessage(UINT uMsg,WPARAM wParam,LPARAM lParam){switch(uMsg){case WM_CREATE:if(FAILED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED,&pFactory)))return -1;// Fail CreateWindowEx.return 0;case WM_DESTROY:DiscardGraphicsResources();SafeRelease(&pFactory);PostQuitMessage(0);return 0;case WM_PAINT:OnPaint();return 0;case WM_SIZE:Resize();return 0;}return DefWindowProc(m_hwnd,uMsg,wParam,lParam);
}

您可以从Direct2D Circle Sample下载完整的Visual Studio项目。
D2D1命名空间
D2D1名称空间包含助手函数和类。这些不是Direct2D API的一部分——您可以在不使用Direct2D的情况下对其进行编程——但它们有助于简化您的代码。D2D1命名空间包含:

  • 用于构建颜色值的ColorF类。
  • 用于构建变换矩阵的Matrix3x2F。
  • 一组函数来初始化Direct2D结构。

您将在整个模块中看到D2D1名称空间的示例。
下一个
呈现目标,设备和资源
相关话题
Direct2D圆圈样本


原文链接:Your First Direct2D Program

Windows桌面应用程序(1-2-4-4th) 您的第一个Direct2D程序相关推荐

  1. 小程序制作预算_做一个小程序的大概预算是多少?做一个小程序大概多少钱?...

    做一个小程序的大概预算是多少?做一个小程序大概多少钱?下面跟随小编一起来看看吧! 小程序开发需要多少钱,这个要看你做什么样的小程序, 你对小程序的功能.框架.定位.交互.UI的要求是什么? 这些都需要 ...

  2. Windows桌面实现之八(DirectX HOOK 方式截取特殊的全屏程序之二)

    by fanxiushu 2019-04-18 转载或引用请注明原始作者. 接上文. WIN7以上系统WDDM虚拟显卡开发(WDDM Filter/Hook Driver 显卡过滤驱动开发之一) 这篇 ...

  3. C++桌面应用开发(Qt学习)--Qt简介及第一个Qt程序

    Qt简介 历史: 1991 奇趣科技 优点:跨平台:接口简单,易上手:简化了内存管理操作 成功案例:Linux桌面环境:WPS:谷歌地图等 创建一个Qt程序 点击创建项目后,选择项目路径以及给项目起名 ...

  4. 编写python程序一年365天_编写第一个Python程序

    无论读者使用的是哪种操作系统,相信都已经安装好了 Python 环境,可以通过命令行窗口或者 Python 自带的 IDLE 成功启动交互式解释器(如图所示). 本节将带领读者正式编写第一个 Pyth ...

  5. linux应用程序是什么,linux下c开发了一个应用程序,它的扩展名是什么?

    这个貌2113似涉及到linux文件系统.linux文件系统与windows的不相同5261,windows系统应该是通4102过文件后缀来进行文件类型是别的,而1653linux虽然也会借鉴后缀信息 ...

  6. 程序员如何成长?如何进阶?——一个老程序员的经验分享2

    准备好了,我们需要开始起步了,所有的理想都是美好的,对于新人来说,这种美好都是原始动力,它不该被抹杀其作用,我很不同意一些人在开始就打击新人的这种出于理想主义的冲动,所以,我在这里要告诉那些新人如何利 ...

  7. 程序员如何成长?如何进阶?——一个老程序员的经验分享1

    做程序员十六年了,带过很多新人,闲着没事就把之前给新人们做培训的资料整理出来,分享一下,希望能给想做程序员的新人们给以建议和帮助. 1.心理准备. 程序员的世界是一个外面看着光鲜亮丽,但是实际里面十分 ...

  8. 程序员如何成长?如何进阶?——一个老程序员的经验分享3

    前面讲的东西显然还是太过理论化了,下面来讲讲具体怎么做才能让一个没有基础的人能够踏进软件开发这个行业来. 有了前面的对这个世界的初步了解,我估计你接下来会考虑难度问题. 从门外看,软件是有一定难度的, ...

  9. c语言小程序解决生活中小问题,自己写的一个小程序 有问题帮帮忙

    题目:任意输入一个五位数 求个位之和 比如12345 即求1+2+3+4+5 #include "stdio.h" main() { unsigned long divide(in ...

最新文章

  1. Python学习笔记2 基本数据类型
  2. ubuntu 升级nodejs 和 npm
  3. 干掉状态:从session到token
  4. 程序员面试100题之六:最长公共子序列
  5. C#中跨线程访问控件问题解决方案
  6. TIOBE 8 月榜单:C 力压 Java 夺得第一,Java掉了1.6 个点
  7. LightOJ - 1245 Harmonic Number (II) 求同值区间的和
  8. 阿里开发者们的第15个感悟:做一款优秀大数据引擎,要找准重点解决的业务场景
  9. html5学习之路_003
  10. 从数据仓库到报表,再到可视化,数字化物流是这么设计架构的
  11. CentOS系统缺少库文件解决办法
  12. oracle的单行函数,Oracle中单行函数之(通用函数)
  13. 凸优化第五章对偶 5.6扰动及灵敏度分析
  14. 基于大数据的数据挖掘算法-大数据
  15. python操作word实现小学拼音本功能
  16. 用Python爬取英雄联盟(lol)全部皮肤
  17. Nginx编译安装与虚拟主机配置
  18. sqli-labs 1~4 多命通关攻略
  19. Dedecms TAG中文标签改成英文+数字地址的方法
  20. 使用AlphaBlend函数实现位图半透明绘制

热门文章

  1. 获取固定到任务栏的快捷方式的图标
  2. 2019年山东省第十届ACM程序设计竞赛 比赛总结
  3. TCP的长连接与短连接
  4. 学习笔记-Burp Suite
  5. 【配送路径规划】蚁群算法求解配送路径最短问题【含Matlab源码 2222期】
  6. 如何在sql语句里添加注释
  7. 基于 SpringBoot+Vue 的开源数据可视化分析工具
  8. Chrome调试骚操作
  9. 工作中遭遇的问题及解决办法
  10. CopyFile复制单个文件和复制指定路径下所有文件