微软文档:Transforms

本篇通过官方文档学习,整理出来的demo,初始样本请先创建一个普通的desktop app。

ID2D1SolidColorBrush* m_pOriginalShapeBrush, * m_pFillBrush,* m_pTransformedShapeBrush;
ID2D1StrokeStyle* m_pStrokeStyleDash; ... LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
Render();
ValidateRect(hWnd, NULL);
}
break;
...
} ... void Render()
{
RECT rc;
GetClientRect(hWnd, &rc); D2D1_SIZE_U size = D2D1::SizeU(
rc.right - rc.left,
rc.bottom - rc.top
);
HRESULT hr = l->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(hWnd, size),
&m_pRenderTarget
); m_pRenderTarget->BeginDraw(); m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
transform(); hr = m_pRenderTarget->EndDraw(); if (FAILED(hr) || hr == D2DERR_RECREATE_TARGET)
{
DiscardGraphicsResources();
}
} void DiscardGraphicsResources()
{
SafeRelease(&m_pOriginalShapeBrush);
SafeRelease(&m_pFillBrush);
SafeRelease(&m_pTransformedShapeBrush);
} void transform()
{
//旋转
HRESULT hr = m_pRenderTarget->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::Black, 1.0F),
&m_pOriginalShapeBrush);
if (SUCCEEDED(hr))
{
hr = m_pRenderTarget->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF(0x9ACD32, 1.0f)),
&m_pFillBrush
);
}
if (SUCCEEDED(hr))
{
hr = m_pRenderTarget->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::Blue, 1.0f),
&m_pTransformedShapeBrush
);
}
// Dash array for dashStyle D2D1_DASH_STYLE_CUSTOM
float dashes[] = { 1.0f, 2.0f, 2.0f, 3.0f, 2.0f, 2.0f }; // Stroke Style with Dash Style -- Custom
if (SUCCEEDED(hr))
{
hr = l->CreateStrokeStyle(
D2D1::StrokeStyleProperties(
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_ROUND,
D2D1_LINE_JOIN_MITER,
10.0f,
D2D1_DASH_STYLE_CUSTOM,
0.0f),
dashes,
ARRAYSIZE(dashes),
&m_pStrokeStyleDash
);
} // Create a rectangle.
D2D1_RECT_F rectangle_1 = D2D1::Rect(438.0f, 301.5f, 498.0f, 361.5f); // Draw the rectangle.
m_pRenderTarget->DrawRectangle(
rectangle_1,
m_pOriginalShapeBrush,
1.0f,
m_pStrokeStyleDash
); // Apply the rotation transform to the render target.
//m_pRenderTarget->SetTransform(
// D2D1::Matrix3x2F::Rotation(
// 45.0f,
// D2D1::Point2F(468.0f, 331.5f))
//); //// Fill the rectangle.
//m_pRenderTarget->FillRectangle(rectangle_1, m_pFillBrush); //// Draw the transformed rectangle.
//m_pRenderTarget->DrawRectangle(rectangle_1, m_pTransformedShapeBrush);
/*************************************************************************/
//缩放
// Create a rectangle.
D2D1_RECT_F rectangle_2 = D2D1::Rect(438.0f, 80.5f, 498.0f, 140.5f); // Draw the outline of the rectangle.
m_pRenderTarget->DrawRectangle(
rectangle_2,
m_pOriginalShapeBrush,
1.0f,
m_pStrokeStyleDash
); //// Apply the scale transform to the render target.
//m_pRenderTarget->SetTransform(
// D2D1::Matrix3x2F::Scale(
// D2D1::Size(1.3f, 1.3f),
// D2D1::Point2F(438.0f, 80.5f))
//);
//// Draw the outline of the rectangle.
//m_pRenderTarget->DrawRectangle(rectangle_2, m_pTransformedShapeBrush);
/*****************************************************************************/
//倾斜
// Create a rectangle.
D2D1_RECT_F rectangle_3 = D2D1::Rect(126.0f, 301.5f, 186.0f, 361.5f); // Draw the outline of the rectangle.
m_pRenderTarget->DrawRectangle(
rectangle_3,
m_pOriginalShapeBrush,
1.0f,
m_pStrokeStyleDash
); //// Apply the skew transform to the render target.
//m_pRenderTarget->SetTransform(
// D2D1::Matrix3x2F::Skew(
// 45.0f,
// 10.0f,
// D2D1::Point2F(126.0f, 301.5f))
//); //// Paint the interior of the rectangle.
//m_pRenderTarget->FillRectangle(rectangle_3, m_pFillBrush); //// Draw the outline of the rectangle.
//m_pRenderTarget->DrawRectangle(rectangle_3, m_pTransformedShapeBrush);
/***************************************************************************/
//平移
// Create a rectangle.
D2D1_RECT_F rectangle_4 = D2D1::Rect(126.0f, 80.5f, 186.0f, 140.5f); // Draw the outline of the rectangle.
m_pRenderTarget->DrawRectangle(
rectangle_4,
m_pOriginalShapeBrush,
1.0f,
m_pStrokeStyleDash
); // Apply the translation transform to the render target.
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Translation(20, 10)); // Paint the interior of the rectangle.
m_pRenderTarget->FillRectangle(rectangle_4, m_pFillBrush); // Draw the outline of the rectangle.
m_pRenderTarget->DrawRectangle(rectangle_4, m_pTransformedShapeBrush); }

效果图:

注意: 对一个对象执行多个变换意味着将多个变换组合为一个。即,将每个变换矩阵的输出用作下一个的输入,从而获得所有矩阵变换的累积效果。

假设将两个变换矩阵(旋转和平移)相乘。结果是一个新的矩阵,同时执行旋转和平移功能。因为矩阵乘法不是可交换的,所以乘以平移变换的旋转变换与乘以旋转变换的平移变换是不同的。

这也就是我每应用一个效果后,都会将其注释的原因。

有专门的文档来介绍了这部分:如何将多个变换应用于对象

Direct2D 旋转篇的更多相关文章

  1. python图像处理

    Python常用处理图像的库是PIL,另外还有opencv.Matplotlib.NumPy.SciPy.skimage 详情请参考:https://www.cnblogs.com/qiaozhoul ...

  2. TGL站长关于常见问题的回复

    问题地址: http://www.thegrouplet.com/thread-112923-1-1.html 问题: 网站配有太多的模板是否影响网站加载速度 月光答复: wp不需要删除其他的模板,不 ...

  3. Direct2D教程(外篇)环境配置

    2014年世界杯首场淘汰赛马上开始了,闲着没事,整理以前的博客草稿打发时间,意外的发现这篇文章,本来是打算加入到Direct2D那个系列的,不知道为什么把它给遗漏了.环境配置,对于熟手来说,不是什么重 ...

  4. ArcGIS制图表达Representation实战篇2-河流渐变与符号旋转

    ArcGIS制图表达Representation实战篇2-河流渐变与符号旋转 by 李远祥 上一章节主要是从实战中使用规则和几何效果,如何分解制图规则.本章主要还是通过一些特殊要求如河流线宽渐变和符号 ...

  5. Direct2D教程VIII——几何(Geometry)对象的运算,本系列的终结篇

    目前博客园中成系列的Direct2D的教程有 1.万一的 Direct2D 系列,用的是Delphi 2009 2.zdd的 Direct2D 系列,用的是VS中的C++ 3.本文所在的 Direct ...

  6. WPF 精修篇 旋转 RotateTransForm

    原文:WPF 精修篇 旋转 RotateTransForm 旋转 RotateTransform Angle 角度 CenterY ,CenterX  中心点位置 和缩小一样 左侧 和右侧 做了对比 ...

  7. Direct2D 第6篇 绘制多种风格的线条

    原文:Direct2D 第6篇 绘制多种风格的线条 上图是使用Direct2D绘制的线条,Direct2D在效率上比GDI/GDI+要快几倍,GDI/GDI+绘图是出了名的"慢", ...

  8. Direct2D 第5篇 绘制图像

    原文:Direct2D 第5篇 绘制图像 我加载的图像是一张透明底PNG图像,背景使用渐变的绿色画刷 #include <windows.h> #include <d2d1.h> ...

  9. Direct2D 第4篇 渐变画刷

    原文:Direct2D 第4篇 渐变画刷 #include <windows.h> #include <d2d1.h> #include <d2d1helper.h> ...

  10. Direct2D 第3篇 绘制文字

    原文:Direct2D 第3篇 绘制文字 #include <windows.h> #include <d2d1.h> #include <d2d1helper.h> ...

随机推荐

  1. [转帖]SQL SERVER中隐式转换的一些细节浅析

    https://www.cnblogs.com/kerrycode/p/5853257.html 其实这是一篇没有技术含量的文章,精通SQL优化的请绕道.这个缘起于在优化一个SQL过程中,同事问了我一 ...

  2. [转帖]一篇来自网络的关于“enqueue”events的简短参考

    https://www.cnblogs.com/lhdz_bj/p/8716701.html 仅供自己和各位同学参考: Enqueue Type Description enq: AD - alloc ...

  3. [转帖]为非root用户添加NOPASSWD权限

    https://www.jianshu.com/p/d1e71bda4b34 查看树莓派默认是怎么为pi用户免去密码 所有配置文件都在 /etc 目录下,免去密码配置文件也不例外.在/etc/sudo ...

  4. [转帖]Spring Cloud 整合 SkyWalking

    https://www.jianshu.com/p/e81e35dc6406 Java Agent 服务器探针 探针,用来收集和发送数据到归集器.参考官网给出的帮助 Setup java agent, ...

  5. ESXi上面虚拟机磁盘损坏修复案例

    事故情况 最近同事反馈, 一个文件更新后出现了文件部分不可读的情况 具体现象为: 前端功能打开白屏 后端文件 前面93行不显示, notepad++打开都是 NULL 黑框. 然后重新覆盖文件, 有概 ...

  6. K8S 知识点

    1. K8S集群大小 在 v1.7 版本中,Kubernetes 支持集群节点(node)数可达1000个.更具体地说,我们配置能够支持所有如下条件: 不超过2000个节点 不超过总共6000个 po ...

  7. vue中v-model修饰符的使用和组件使用v-model

    1.lazy 修饰器 lazy修饰器在input框中的表现效果是: 当你失去焦点后值才会跟新. 它的跟新时机是失去焦点后 这个修饰器在项目中运用的场景较少 <template> <d ...

  8. 如何处理开发环境没有问题,线上环境有问题这个bug

    解决思路 首先确认开发环境有没有这个问题: 如果没有这个问题: 将你的地址切换为线上的环境,看看线上环境有没有这个问题: 如果切换为线上环境有这个问题,就可以调试了: 如果切换为线上环境没有这个问题, ...

  9. 关于飞桨UIE等模型预测推理时间很久的问题分析以及解决,蒸馏剪枝部署问题解决

    1.关于飞桨UIE等模型预测推理时间很久的问题分析以及解决 1.1.原因分析 用uie做实体识别,Taskflow预测的时间与schema内的实体类别数量成正比,schema里面有多少个实体类别 实体 ...

  10. C/C++ 常见数组排序算法

    本文介绍了几种常见的排序算法的实现,包括冒泡排序.选择排序.插入排序.希尔排序.归并排序和快速排序.冒泡排序通过多次遍历数组,比较并交换相邻元素,逐步将较小元素"浮"到数组顶端,时 ...