微软文档: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. [转帖]Difference between localhost and 127.0.0.1?

    https://www.tutorialspoint.com/difference-between-localhost-and-127-0-0-1#:~:text=The%20most%20signi ...

  2. [转帖]TiDB + TiFlash : 朝着真 HTAP 平台演进

    https://zhuanlan.zhihu.com/p/80495479 作者介绍:韦万,PingCAP 数据库研发工程师,主要领域是数据库的存储引擎研发,以及系统性能优化. 一.为什么我们需要 H ...

  3. [转帖]浅析TiDB二阶段提交

    https://cloud.tencent.com/developer/article/1608073 关键内容说明: TiDB 对于每个事务,会涉及改动的所有key中,选择出一个作为当前事务的Pri ...

  4. [转帖]Jmeter学习笔记(六)——使用badboy录制脚本

    https://www.cnblogs.com/pachongshangdexuebi/p/11506274.html 1.下载安装 可以去badboy官网下载地址:http://www.badboy ...

  5. 【转帖】Docker容器四种网络模式

    https://blog.whsir.com/post-5268.html docker自身默认提供了四种网络模式:none.bridge.container.host.除了这四种网络模式外,还可以通 ...

  6. AIGC的隐私安全问题及隐私保护技术

    作者:京东科技 杨博 ChatGPT 才出现两个月,就已经引起了学术界的关注.微软成为ChatGPT母公司OpenAI的合作伙伴,并确认投资百亿美元.同时,微软正计划将 OpenAI 的技术整合到其产 ...

  7. 开源IM项目OpenIM每周迭代版本发布-群管理 阅后即焚等-v2.0.6

    新特性介绍 OpenIM每周五发布新版,包括新特性发布,bug修复,同时合并PR,解决issue等 一个完善的IM系统,非常复杂,功能繁多,需求不一,比如对象存储有云端oss,cos,s3,私有化存储 ...

  8. SpringAll

    目录 Spring Cloud 01-初识SpringCloud与微服务 02-SpringCloud-Feign声明式服务的调用 Spring Security 01-SpringSecurity- ...

  9. PaddleHub--飞桨预训练模型应用工具{风格迁移模型、词法分析情感分析、Fine-tune API微调}【一】

    相关文章: 基础知识介绍: [一]ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?_汀.的博客-CSDN博客_ernie模型 百度飞桨:E ...

  10. 《字节码编程》PDF107页,11万字。既然市面缺少ASM、Javassist、Byte-buddy成体系的学习资料,那我来!

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 让人怪不好意思的,说是出书有点膨胀,毕竟这不是走出版社的流程,选题. ...