这一篇主要谈谈如何创建简单的D2D窗口并绘制一个进行sin移动矩形出来。

首先,我们需要有个比较清楚的思路来进行D2D的开发。

开发Direct2D程序的一般步骤

l  包含 Direct2D 头文件

l  创建 D2D1Factory

l  创建 RenderTarget

l  创建画刷

l  渲染

l  释放资源

以上就是做Direct2D开发的一般步骤,具体的我们可以暂时不管它,到时候可发的时候可以慢慢领会。

不过我们需要记住的是,微软给我们提供了很多库供我们使用开发,那么,我们就需要根据他们的思路来进行开发,很多时候没有那么多为什么的。

好,现在我们就来开始实现出一个简单的D2D窗口并画出一个矩形出来。

步骤过程如下:

第一步:

包含头文件

#include<d2d1.h>

第二步:

创建D2D1Factory

ID2D1Factory *pFactory = NULL;
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);

第三步:

创建RenderTarget

ID2D1HwndRenderTarget *pRenderTarget = NULL;
RECT rtClient = { 0 };//定义一个矩形
GetClientRect(hwnd, &rtClient);//获得窗口大小
HRESULT hr = pFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),D2D1::HwndRenderTargetProperties(hwnd,D2D1::SizeU(rtClient.right - rtClient.left,rtClient.bottom - rtClient.top)),&pRenderTarget);

第四步:

创建画刷

ID2D1SolidColorBrush *pBrush = NULL;
HRESULT hr = pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red), &pBrush);

第五步:

渲染

pRenderTarget->BeginDraw();
//需要渲染的内容都应该写在BeginDraw()和EndDraw()之间
pRenderTarget->EndDraw();

第六步:

释放资源

(释放的资源指针)->Release();

在具体的就不多讲,以上就是实现的整个步骤。下面直接贴出本实例的代码(创建简单的D2D窗口并绘制一个进行sin移动矩形出来)

/***************************************************************
功能:简单的D2D窗口创建、矩形的sin曲线移动
作者:***
版本:1.0
日期:2016.4
****************************************************************/
#include <Windows.h>
#include<d2d1.h>
#include<cmath>//函数声明
void CreateResource();//变量声明
ID2D1Factory *pFactory = NULL;
ID2D1HwndRenderTarget *pRenderTarget = NULL;
ID2D1SolidColorBrush *pBrush = NULL;HWND hwnd = 0;
RECT rt = { 0 }, rtClient = { 0 };
int num = 1;void init()
{if (!hwnd){return;}GetClientRect(hwnd, &rtClient);CreateResource();
}void CreateResource()
{HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);if (SUCCEEDED(hr)){hr = pFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),D2D1::HwndRenderTargetProperties(hwnd,D2D1::SizeU(rtClient.right - rtClient.left,rtClient.bottom - rtClient.top)),&pRenderTarget);if (SUCCEEDED(hr)){hr = pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red), &pBrush);if (FAILED(hr)){MessageBox(hwnd, TEXT("Create Resource Fail!"), TEXT("Error"), MB_OK);return;}}}
}
void DrawRectangle()
{if (pRenderTarget){pRenderTarget->BeginDraw();pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::Black));pRenderTarget->DrawRectangle(D2D1::RectF(rt.left + 0.0f, rt.top + 200.0f, rt.right + 50.0f, rt.bottom + 250.0f), pBrush);pRenderTarget->EndDraw();}
}
void Render()
{DrawRectangle();num += 5;rt.right += 2;rt.left += 2;rt.top = (100 * sin(num * 3.14 / 180));rt.bottom = (100 * sin(num * 3.14 / 180));if (rt.right == 1000){rt = { 0 };num = 0;}
}template<class Interface>
inline void SafeRelease(Interface **ppinterfaceToRelease)
{if (NULL != *ppinterfaceToRelease){(*ppinterfaceToRelease)->Release();(*ppinterfaceToRelease) = NULL;}
}
void CleanUp()
{SafeRelease(&pBrush);SafeRelease(&pRenderTarget);SafeRelease(&pFactory);
}LRESULT CALLBACK WndProc(HWND Hwnd, UINT message, WPARAM wParam, LPARAM iParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{MSG Msg;WNDCLASS wndclass;TCHAR lpszTitle[] = TEXT("MyDemo001");wndclass.style = CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = TEXT("MyClass");wndclass.hbrBackground = 0;if (!RegisterClass(&wndclass)){MessageBox(NULL, TEXT("RegisterClass fail!"), TEXT("error"), MB_ICONERROR);return 0;}hwnd = CreateWindow(TEXT("MyClass"),lpszTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);init();BOOL bRet;PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE);while (Msg.message != WM_QUIT){bRet = PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE);if (bRet){TranslateMessage(&Msg);DispatchMessage(&Msg);}else{Render();}}CleanUp();return Msg.wParam;
}LRESULT CALLBACK WndProc(HWND Hwnd, UINT message, WPARAM wParam, LPARAM iParam)
{switch (message){case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(Hwnd, message, wParam, iParam);
}

需要注意的是,SUCCEEDED或FAILD宏是用来检测创建的对象是否成功的。

最后的效果如下:

DirectX技术----D2D基础篇(一)相关推荐

  1. GPU技术支持-基础篇-包管理工具

    GPU技术支持-基础篇-包管理工具 目录 GPU技术支持-基础篇-包管理工具 前言 概述 包管理工具简介 dpkg「Debian Package」 rpm「RPM Package Manager」 依 ...

  2. 机器学习(四):剪枝技术(基础篇)

    机器学习(四):剪枝技术(基础篇) 相关的决策树文章: 机器学习(四)ID3决策树 机器学习(四)C4.5决策树 机器学习(四)CART分类树 机器学习(四)CART回归树 机器学习(四)决策树绘图 ...

  3. 数字视频测量应用技术(基础篇)

    数字视频测量应用技术(基础篇) 第三章 数字分量视频信号测量 3.1 串行分量数字信号 P101 3.1.1 演播室数字分量信号标准 3.1.1.1 标清(SDTV)部分 3.1.1.2 高清(HDT ...

  4. 网络技术学习基础篇。

    提示:大多以华为为例.真难学艹 前言 记录我学习网络技术,希望对大家有所帮助. 目录 第一章.基础知识 第一节,计算机网络概述 1,定义: 2,基本功能: 3,类型: 4,网络简介 5,网络设备的架构 ...

  5. 测试需要了解的技术之基础篇四__UI自动化测试体系

    UI自动化测试体系 1.Andriod 自动化测试:Appium 环境安装与架构介绍.Appium Desktop用例录制.Appium测试用例流程.元素定位方法 IA/AID/XPATH/UISel ...

  6. ipsec VPN技术(基础篇二)

    1,前言 上次我们介绍了什么是ipsec已经ipsec的工作流程和其中使用的一些协议,下面将讲解一下ipsec的工作模式和协议是如何联系工作的. 2,ipsec 封装模式 AH ,ESP,AH+ESP ...

  7. java基础篇_java基础篇1

    JAVA基础篇1 注释 单行注释 //这是一个单行注释,由两个斜杠组成,不能嵌套多行注释 多行注释 /*这是一个 多行注释 ,//里面不能嵌套多行注释, 但是可以嵌套单行注释*/ 文档注释 /**ja ...

  8. Linux技术研究-基础篇(raid与LVM,配额)

    Linux技术研究-基础篇(raid与LVM,配额) 创建RAID-5 若想建立新的md1设备 只在/dev下建立还不够 重启后会消失 固化的方法是 为了使udev自动产生/dev/md1, /dev ...

  9. 计算机数据库管理基本知识,2015年计算机四级考试《数据库技术》基础知识:概念篇...

    2015年计算机四级考试<数据库技术>基础知识:概念篇 信息与数据 1. 信息.物质.能量是组成客观世界并促进社会发展的三大基本要素; 2. 信息(Information)--是客观世界事 ...

最新文章

  1. 点击事件如何传递到Activity中
  2. matlab中大figure怎样修改,操作Matlab的Figure窗口(一)
  3. expandableListView 总结
  4. java多线程中几个常用的方法
  5. java string类型_java中String类型
  6. yy神曲url解析php_php解析url的三个示例
  7. centos7.6 安装nginx-1.14.2
  8. 产品经理如何搞定客户和业务
  9. 对报表模型项应用安全筛选器
  10. c语言实验报告总结通用版,大学生实训心得体会(通用11篇)
  11. c语言怎么学自学,初学者如何学习c语言,带你玩转C语言
  12. Linux常用命令(四)
  13. mysql过期数据_mysql过期数据如何删除
  14. 良好的编程习惯有哪些?
  15. CDH问题汇总之——ERROR main:com.cloudera.server.cmf.bootstrap.EntityManagerFactoryBean: Tables have unsuppo
  16. C语言程序设计教程蒋清明,C语言程序设计教程(第2版)
  17. 数据、运营相关案例问答题(一)【牛客网:数据分析试题广场】
  18. CharacterController 人物移动、跳跃
  19. 【HTML】关于height值设置和显示不同的原因以及font-size对象为中文和英文的区别
  20. extjs6 异步树

热门文章

  1. 微信小程序上传图片 预览 删除
  2. 那些年这么火的MyCat你还不知道吗?
  3. jQuery悬浮菜单
  4. 地图数据设计(四):地图比例尺
  5. Wang Changyu
  6. 爱普搜 | 2021年1月零售汽车销量排名
  7. php拼接全景图,Opencv使用Stitcher类图像拼接生成全景图像
  8. 计算机网络之构造超网(无分类编址)
  9. 源代码可以申请专利和版权吗?
  10. AE教程丨星球文字环绕特效