当前位置: 首页 > news >正文

001:你好Direct 2D! 在对话框中初次使用D2D

1、简介        

        对于如何提高2D的绘制效率,一直在进行着尝试。基于OpenGL的纹理贴出做过一些二维图像处理的工作,但相对麻烦些,需要由GDI/GDI+绘制后,在贴出去,麻烦,且由于OpenGL停止了更新,不支持多线程等原因,慢慢的继续做下去的动力就不足。无意间看到MSDN中关于Direct 2D的结论(现有 GDI 代码将继续在 Windows 7 下正常工作。 但是,编写新的图形呈现代码时,应考虑 Direct2D ,因为它更好地利用新式 GPU。),故而打算写一序列的博客,记录下学习和测试Direct2D编程和性能的内容。

2、基于对话框的第一个 Direct 2D程序

        新建MFC对话框项目,项目名称自己写即可,本例子项目名称为:001D2DDialog,建好后,在解决方案中查看代码,如下所示

“解决方案资源管理器”中的001_D2D_Dialog项目的“头文件”文件夹中,打开 001_D2D_DialogDlg.h。 将以下代码添加到 001_D2D_DialogDlg类以创建三个数据变量。

CD2DTextFormat* m_pTextFormat;
CD2DSolidColorBrush* m_pBlackBrush;
CD2DLinearGradientBrush* m_pLinearGradientBrush;

在001_D2D_DialogDlg.cpp中,在 001_D2D_DialogDlg类的构造函数中,添加以下代码:

    // Enable D2D support for this window:
	EnableD2DSupport();

	// Initialize D2D resources:
	m_pBlackBrush = new CD2DSolidColorBrush(GetRenderTarget(), D2D1::ColorF(D2D1::ColorF::Black));

	m_pTextFormat = new CD2DTextFormat(GetRenderTarget(), _T("Verdana"), 50);
	m_pTextFormat->Get()->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);
	m_pTextFormat->Get()->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);

	D2D1_GRADIENT_STOP gradientStops[2];

	gradientStops[0].color = D2D1::ColorF(D2D1::ColorF::White);
	gradientStops[0].position = 0.f;
	gradientStops[1].color = D2D1::ColorF(D2D1::ColorF::Indigo);
	gradientStops[1].position = 1.f;

	m_pLinearGradientBrush = new CD2DLinearGradientBrush(GetRenderTarget(),
		gradientStops, ARRAYSIZE(gradientStops),
		D2D1::LinearGradientBrushProperties(D2D1::Point2F(0, 0), D2D1::Point2F(0, 0)));

右键单击项目,在菜单上单击“类向导”,如下图:

 打开如下类向导窗口

 在“消息”选项卡上的“消息”框中,选择 WM_SIZE,然后单击“添加处理程序”。 此操作将 OnSize 消息处理程序添加到001_D2D_DialogDlg类

“现有处理程序”框中,选择 OnSize。 单击“编辑代码”以显示 001_D2D_DialogDlg::OnSize 方法。 在此方法的末尾,添加以下代码。

m_pLinearGradientBrush->SetEndPoint(CPoint(cx, cy));

在“消息”选项卡上,单击“添加自定义消息”。

“添加自定义消息”对话框的“自定义 Windows 消息”框中,键入 AFX_WM_DRAW2D。 在“消息处理程序名称”框中,自动显示OnAfxWmDraw2d。 选择“已注册的消息”选项,然后单击“确定”。 此操作将 AFX_WM_DRAW2D 消息的消息处理程序添加到001_D2D_DialogDlg类。

 

“现有处理程序”框中,选择 OnAfxWmDraw2d。 单击“编辑代码”以显示 001_D2D_DialogDlg::OnAfxWmDraw2d 方法。 对001_D2D_DialogDlg::OnAfxWmDraw2d 方法使用以下代码。

afx_msg LRESULT CMy001D2DDialogDlg::OnAfxWmDraw2d(WPARAM wParam, LPARAM lParam)
{
	CHwndRenderTarget* pRenderTarget = (CHwndRenderTarget*)lParam;
	ASSERT_VALID(pRenderTarget);

	CRect rect;
	GetClientRect(rect);

	pRenderTarget->FillRectangle(rect, m_pLinearGradientBrush);

	pRenderTarget->DrawText(_T("Hello, World!"), rect, m_pBlackBrush, m_pTextFormat);

	return 0;
}

3、显示效果

       生成并运行应用程序。 它应有一个在您调整窗口大小时更改的渐变矩形。“Hello World!”应显示在矩形中央。

4、结束语 

         下一篇,将重点梳理下D2D的接口以及MFC对其的封装。

相关文章:

  • 文件系统基础
  • 2022/9/5开始第三版接口自动化(yaml用例)测试框架(记录搭建过程)
  • Github每日精选(第38期):Java 8+ Jar 和 Android APK 逆向工程套件(反编译器、编辑器、调试器等)bytecode-viewer
  • Pandas 操作数据(三)
  • 查题系统API无限搜题接口搭建
  • python之爬虫基础(1)
  • CVE-2022-22978 Spring-security 认证绕过漏洞分析和漏洞挖掘思考
  • 小孩取名:瑭字的寓意和含义
  • 7、IOC 之Bean定义继承 parent
  • J9数字论:模块化公链能否成为公链新趋势?
  • UVM环境中reset复位的处理
  • 示波器探头的选择和作用及原理
  • 新学期,我的FLAG不能倒~
  • 好心情精神心理科医生:精神病人为何会出现幻觉?
  • java计算机毕业设计ssm电子元件仓库管理系统
  • 收藏网友的 源程序下载网
  • @jsonView过滤属性
  • 「面试题」如何实现一个圣杯布局?
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【React系列】如何构建React应用程序
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 30秒的PHP代码片段(1)数组 - Array
  • Angular 响应式表单 基础例子
  • chrome扩展demo1-小时钟
  • express.js的介绍及使用
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • java8 Stream Pipelines 浅析
  • js如何打印object对象
  • Map集合、散列表、红黑树介绍
  • Node项目之评分系统(二)- 数据库设计
  • passportjs 源码分析
  • Python_OOP
  • Redis中的lru算法实现
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 阿里云应用高可用服务公测发布
  • 给github项目添加CI badge
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 爬虫模拟登陆 SegmentFault
  • 前端路由实现-history
  • 深入浅出webpack学习(1)--核心概念
  • 使用 QuickBI 搭建酷炫可视化分析
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 通过npm或yarn自动生成vue组件
  • 我建了一个叫Hello World的项目
  • 正则表达式小结
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 容器镜像
  • ​如何在iOS手机上查看应用日志
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1)Nginx简介和安装教程
  • (20050108)又读《平凡的世界》
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇