微软文档: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. [转帖]Linux—解压缩命令总结(tar/zip)

    https://www.jianshu.com/p/1ad5d852d13b 1 tar 1.2 tar介绍   tar命令是linux系统中对文件和目录解压缩命令.tar命令可以用于对后缀名为.ta ...

  2. [转帖] jq命令用法总结

    https://www.cnblogs.com/codelogs/p/16324928.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 如果说要给Li ...

  3. 【转帖】bpftrace 指南

    文章目录 0. bpftrace 0.1 bpftrace组件 0.2 bpftrace 帮助信息 0.3 bpftrace 工具速览表 0.4 bpftrace 探针 0.4.1 tracepoin ...

  4. [转帖]TCP/IP RFC

    TCP/IP RFC-阿里云开发者社区 TCP/IP 标准是在一系列称为 RFC 的文档中发布的.RFC 是目前仍在发展的描述 TCP/IP 和 Internet 内部工作的一系列报告.协议的提议以及 ...

  5. Raid卡在Write back 与Write through 时的性能差异

    还是读姜老师的 mysql技术内核innodb存储引擎这本书里面的内容. 之前知道raid卡的设置会影响性能, 预计也是十几倍的性能差距, 但是从来没有用数据库进行过验证 书中有针对不通raid卡的设 ...

  6. echarts设置暂无数据

    场景描述 我们在项目中,很多时候都会使用echarts进行数据展示. 当没有数据的时候,echarts的展示就会特别的难看. 这个时候我们就会优化界面的显示,在echarts中展示暂无数据. 有很多中 ...

  7. uni-app事件冒泡 如何解决事件冒泡 推荐tap事件

    冒泡事件## 冒泡事件 <view class="max-box" @tap="waimian"> 外面 <view class=" ...

  8. P5963 [BalticOI ?] Card 卡牌游戏【来源请求】

    [rt](https://www.luogu.com.cn/problem/P5963)------------## part1### 题意简述给你 $n$ 张纸牌,每张纸牌有两个面.将 $n$ 张纸 ...

  9. Docker 安装与升级

    卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest ...

  10. Python 多线程实现爬取图片

    前阵子网上看到有人写爬取妹子图的派森代码,于是乎我也想写一个教程,很多教程都是调用的第三方模块,今天就使用原生库来爬,并且扩展实现了图片鉴定,图片去重等操作,经过了爬站验证,稳如老狗,我已经爬了几万张 ...