|
GDI+提供从简单到复杂图形绘制的大量方法,并且我们可以通过对路径和区域的操作构造出更复杂的图形,这在CAD等场合极为有用。当然,在绘图之前我们有必要搞清一些基本内容,如坐标空间、画笔和画刷等。
则笔画宽度为3,以及矩形的左上角顶点坐标和大小单位都为毫米,其结果如图所示。 ![]() SetPageScale和GetPageScale GDI+的这两个属性函数分别用来设置和获取页面的缩放比例。例如,当上面的绘图代码变成:
代码中,REAL是一个浮点类型的定义。上述代码的结果如图2所示。 ![]() 图2 TranslateTransform GDI+的TranslateTransform方法用来改变坐标的原点位置,例如TranslateTransform(100, 50)是将坐标原点移到点(100,50)。 画笔 画笔是用来绘制各种直线和曲线的一种图形工具,GDI+的Pen类为画笔提供了丰富的方法。一般来说,我们可以通过其构造函数来指定画笔的颜色和宽度,其定义如下: Pen( const Color& color, REAL width ); 其中,color是用来指定画笔颜色,width用来指定画笔宽度。REAL是一个float类型定义,而Color是GDI+的一个颜色类,它既可以指定一个ARGB颜色类型,也可以使用GDI+预定义的颜色值,甚至可以将COLORREF转换成Color类型的颜色。例如,下面的代码都是创建一个宽度为3,颜色为蓝色的画笔:
除了颜色外,GDI+的Pen类还提供SetDashStyle和SetDashPattern方法来设置画笔的预定义风格和自定义类型。其中,预定义风格可以有:DashStyleSolid(实线)、DashStyleDash(虚线)、DashStyleDot(点线)、 DashStyleDashDot(点划线)、DashStyleDashDotDot(双点划线)和DashStyleCustom(自定义类型)。例如下列代码,其结果如图7.6所示:
![]() 但是,在工程应用中,预定义风格的画笔有时并不能满足实际的需求,而必须自己定义一些线型,这需要通过SetDashPattern函数来实现。SetDashPattern的原型如下:
其中,dashArray是一个包含短划和间隔长度的数组,count表示数组的大小。注意,dashArray中的短划长度和间隔长度是成对出现的,例如下列代码是使用自定义类型的画笔,其结果如图7.7所示。
![]() 需要说明的是,GDI+的Pen类还提供SetStartCap和SetEndCap方法来设置一条直线的起始端和终止端的样式。例如下面的代码,其结果如图7.8所示。
![]() 画刷和渐变 画刷用于指定填充的特性,GDI+为填充色和阴影线画刷提供了SolidBrush和HatchBrush类。通过它们的构造函数直接可以创建一个画刷,其构造函数的原型如下:
其中,foreColor和backColor用来指定阴影线颜色和填充的背景颜色,背景色可以不指定。hatchStyle用来指定阴影线的样式,它可以是这样的一些预定义样式:HatchStyleHorizontal (水平线)、HatchStyleVertical(垂直线)、HatchStyleForwardDiagonal(上斜线)、 HatchStyleBackwardDiagonal(下斜线)、HatchStyleCross(十字线)以及 HatchStyleDiagonalCross (交叉线)等。当然,还有许多样式如HatchStyle30Percent(30%填充)、HatchStyleSolidDiamond (实心菱形)等,这里不一一列举。 由于在前面的示例中,对这种简单的画刷的使用已介绍过,因而这里着重讨论渐变画刷的创建和使用。 GDI+提供了LinearGradientBrush和PathGradientBrush类分别用来创建一个直线渐变和路径渐变画刷。 直线渐变是指在一个矩形区域使用两种颜色进行过渡(渐变),过渡方向可以是水平、垂直以及对角线方向。LinearGradientBrush构造函数的原型如下:
其中,point1和point2分别用来指定矩形区域的左上角和右下角点坐标,color1和color2分别用来指定渐变起始和终止的颜色。 rect用来指定一个矩形区域的大小和位置,angle用来指定渐变的方向角度,正值为顺时针。isAngleScalable是一个即将废除的参数。 mode用来指定渐变的方法,它可以是LinearGradientModeHorizontal(水平方向)、 LinearGradientModeVertical (垂直方向)、LinearGradientModeForwardDiagonal(从左下到右上的对角线方向)和 LinearGradientModeBackwardDiagonal(从左上到右下的对角线方向)。 需要说明的是,Point和Rect是GDI+新的数据类型,它们和MFC的CPoint和CRect类的功能基本一样,但它们相互之间不能混用。 路径渐变画刷是用渐变颜色来填充一个封闭的路径。一个路径既可以由一系列的直线和曲线构成,也可以由其它对象来构造。路径渐变是一种中心颜色渐变模式,它从路径的中心点向四周进行颜色渐变。PathGradientBrush构造函数的原型如下:
其中,path用来指定一个路径指针,points和count分别用来指定组成路径的一系列直线端点的数组及其大小,wrapMode是一个可选项,用来指定填充的包围模式。一个包围模式用来决定是否在区域内部、在区域外部以及所有区域都填充。默认时,其值为WrapModeClamp,即在区域内部填充。 下面的代码说明了上述两种渐变画刷的使用方法:
结果如图7.9所示。 需要说明的是,画笔和画刷还可使用一个图片来创建。例如下列代码,其结果如图7.10所示。
![]() 图形几何变换 图形变换一般是对图形的几何信息经过几何变换后产生新的图形。常见二维图形的变换有平移、比例、对称、旋转、错切等。图形几何变换最有效的手段是采用矩阵变换,GDI+就有这样的矩阵类Matrix,它为我们提供了许多变换的方法,如Invert(转置)、Multiply(矩阵相乘)、Rotate (旋转)等。例如下面的代码就是Matrix::Rotate一个例子,其结果如图7.11所示。
需要说明的是,代码中的MatrixOrderAppend用来指明第二个矩阵(若有)的操作次序是后置的,即matrix1 OP matrix2,OP表示某种操作;若为MatrixOrderPrepend 则表示matrix2 OP matrix1。而SetTransform则指定一个矩阵对点坐标进行变换,新的坐标点(x*,y*)结果可用下列公式来表示: [x* y* 1] = [x y 1] = [m11x+m21y+dx m12x+m22y+dy 1]式中,dx和dy用来指定x和y方向的平移量,若dx = dy = 0,则: (1) 当m21 = m12 = 0,m11 = -1,m22 = 1时,有x*= -x,y*= y,产生与y轴对称的反射图形; (2) 当m21 = m12 = 0,m11 = 1,m22 = -1时,有x*= x,y*= -y,产生与x轴对称的反射图形; (3) 当m21 = m12 = 0,m11 = m22 = -1时,有x*= -x,y*= -y,产生与原点对称的反射图形; (4) 当m21 = m12 = 1,m11 = m22 = 0时,有x*= y,y*= x,产生与直线y = x对称的反射图形; (5) 当m21 = m12 = -1,m11 = m22 = 0时,有x*= -y,y*= -x,产生与直线y = -x对称的反射图形; (6) 而当m11 = m22 = cosq,m21 = -m12 = sinq 时,则进行旋转变换。 例如下列代码,其结果如图7.12所示。
![]() 其中,Matrix的构造函数有如下定义:
需要说明的是,除了使用Matrix进行图形变换外,Graphics本身提供相应的变换方法,如RotateTransform(旋转变换)、ScaleTransform(比例变换)和TranslateTransform(平移变换)等。 基本绘图函数 在前面许多示例中,我们已经用到如DrawLine等基本绘图函数。除此之外,还有许多这样的函数,并且每个绘图函数都有其重载形式,这给我们带来了许多方便。表7.1列出这些基本绘图函数。 表1 GDI+常用基本绘图函数
下面的代码是通过路径用两条样条曲线构造一个复杂的区域,然后填充它,其结果如图7.13所示。
![]() |
相关推荐
Visual C++.NET 应用编程实战与案例分析150例
本文还有配套的精品资源,点击获取 简介:《Visual C++.NET 应用编程150例》汇集了丰富的编程案例,覆盖了从基础语法到高级技术的各个方面,以帮助开发者深入理解和应用C++.NET语言及其在.NET Framework环境下的功能。内容包括C++类和对象的面向对象编程、.NET基础类库、Windows Forms的界面控件使用和事件驱动编程、MFC库的介绍、图形与...
【C++】GDI+图像编程入门(二、图像的光栅特效显示编程)
C++本人也是初学者,很多地方也不是很懂,写博客的原因主要有以下三个原因:1.对于学习的得思路和资料进行整理2.为比我还菜的朋友提供一定得参考3.请优快云高手对我写的代码进行批评和指正。 首先还是建立四个变量m_ImageShow:为COpenImageFileApp类中的一个CImage类型的公共变量m_StrImageFileName:为COpenImageFil
c++ GDI+绘图
GDI+绘图,支持缩放,裁剪任意区域,任意角度的旋转和镜像,及各种样式画刷,功能强大
C++使用GDI+进行简单绘图与擦除
C++使用GDI+进行简单绘图与擦除 绘图主要是捕捉鼠标下落与升起事件,文中应用的是Duilib库进行界面编程的,对应的也就是WM_LBUTTONDOWN和WM_LBUTTONUP消息事件,画图的主要实现是开启一个线程,一直循环去捕捉用户的WM_LBUTTONDOWN和WM_LBUTTONUP事件,遇到WM_LBUTTONDOWN事件时,运用GetMousePos()函数或GetCursorPos...
Visual C++游戏编程基础6
Visual C++游戏编程基础6.........
C++ GDI+ 实现的画板程序
用C++结合GDI+实现了画板的基本功能,可以绘出各种图形,改变画笔颜色,划线的粗细以及填充等功能!适合GDI+和C++学习者学习
C++的GDI+ 处理图集tif TIFF ,动态图片GIF,gif
从多帧图像复制单个帧 下面的示例从多帧 TIFF 文件中检索各个帧。 创建 TIFF 文件后,会将各个帧添加到页面维度 (请参阅创建和保存 Multiple-Frame 映像) 。 此代码显示四个页面中的每一页,并将每个页面保存到一个单独的 PNG 磁盘文件。 此代码从多帧 TIFF 文件构造图像对象。 为了 (页面) 检索各个帧,代码将调用该图像对象的Image:: SelectActiveFrame方法。 传递给Image:: SelectActiveFrame方法的第一个参数是 ...
【C++】自学GDI&GDI+
5个小时就能学好GDI+,内附源码,以及教学文档和教学视频链接。目前最优秀的教程。
Visual C++.NET GDI+编程基础方案
GDI+提供从简单到复杂图形绘制的大量方法,并且我们可以通过对路径和区域的操作构造出更复杂的图形,这在CAD等场合极为有用。当然,在绘图之前我们有必要搞清一些基本内容,如坐标空间、画笔和画刷等。 坐标空间及其变换 在视图和窗口中绘图或定位总是在一个二维坐标系进行,依据作用方法的不同,坐标有多种表示方法,并且各种不同坐标之间可以相互转换。 1. 世界坐标系、设备坐标系和页面坐标系 GDI+
某盾blackBox逆向——纯算
某盾blackBox逆向——纯算
超简单的视频换脸,效果相当不错!完全白嫖的技术,来自ComfyUI 官方客户端一键搞定!手把手教会你如何下载安装部署,而且教你如何使用。
如果你电脑上没有安装Visual Studio的C++桌面开发组件,还有Windows应用SDK C++模板,那么你需要自行去下载安装下【安装后默认界面会自动识别系统语言,当然如果你是中文繁体用户,那么你可以在 ComfyUI 的管理器里下载。】并把它放入根目录-models-insightface文件夹内 , 同时下载视频换脸工作流 【分享手把手教你视频换脸,本地部署,轻轻松松当上“电影主角”】,否则insightface无法被正常载入。) 这是换脸必备的工具 ,安装后重启;
基于Visual C++.NET的GDI+开发教程
GDI+接口是Microsoft Whistler操作系统中的一部分,它是GDI的一个新版本,不仅在GDI基础上添加许多新特性而且对原有的GDI功能进行优化。在为开发人员提供的二维矢量图形、文本、图像处理、区域、路径以及图形数据矩阵等方面构造了一系列相关的类,如Bitmap(位图类)、Brush(画刷类)、Color(颜色类)、Font(字体类)、Graphics(图形类)、Image(图像类)、...
UNITY2022 Cardboard环境搭建
必须安装 Git,并且 git 可执行文件必须位于 PATH 环境变量中。考文档:https://developers.google.cn/cardboard/develop/unity/quickstart?转到 Assets/Samples/Google Cardboard//Hello Cardboard/Scenes/HelloCardboard 场景中。粘贴https://github.com/googlevr/cardboard-xr-plugin.git到文本输入字段中。
用Visual C++.NET进行GDI+编程
6、用Visual C++.NET使用GDI+的一般方法 在Visual C++.NET使用GDI+一般遵循下列步骤: (1) 在应用程序中添加GDI+的包含文件gdiplus.h以及附加的类库gdiplus.lib。通常gdiplus.h包含文件添加在应用程序的stdafx.h文件中,而gdiplus.lib可用两种进行添加:第一种是直接在stdafx.h文件中添加下列语句:
GPT注册与使用全流程详解:从零到一的实战指南
本文详细介绍了GPT的注册与使用全流程,从认识GPT作为智能对话助手开始,到注册前的设备与环境准备、手把手完成账号注册、首次使用指南以及进阶使用技巧。文章还涵盖了安全使用与注意事项,帮助用户从零开始高效利用GPT提升工作效率和内容创作能力。
SwinTransformer 改进:SSPCAB模块(2024最新改进方法)
SSPCAB(Spatial Pyramid Pooling with Channel Attention Block)是2024年提出的一种新型神经网络架构改进方法,专注于在保持高精度的同时显著降低计算复杂度和参数量。该方法通过创新的空间金字塔池化与通道注意力机制的结合,实现了网络结构的紧凑化和运算效率的大幅提升。核心创新点1. 混合空间金字塔池化(Hybrid Spatial Pyramid Pooling, HSPP)多尺度动态核池化:根据输入特征图尺寸动态调整池化核大小和步长交叉级联结构。
visual c++gdi_Visual Basic .NET中的GDI +图形
visual c++gdi GDI+ is the way to draw shapes, fonts, images or generally anything graphic in Visual Basic .NET. GDI +是在Visual Basic .NET中绘制形状,字体,图像或一般任何图形的方法。 This article is the first part of a c...
【Power Compiler手册】4.saif文件
功耗计算的准确性取决于切换活动数据的准确性。这些数据是通过使用RTL仿真或门级仿真生成的,并存储在SAIF文件中。在执行功耗优化和分析之前,应该使用SAIF文件来反标设计对象上的切换活动信息。SAIF是由Synopsys支持的ASCII格式,用于促进不同Synopsys工具之间的信息交换(参见IEEE 1801标准,附录J)。使用`read_saif`命令读取SAIF文件,使用`write_saif`命令写出SAIF文件。有关更多信息,请参见`read_saif`和`write_saif`命令的手册页。
GDI+编程基础(一)GDI+ Vs GDI
一、GDI GDI是位于应用程序与不同硬件之间的中间层,这种结构让程序员从直接处理不同硬件的工作中解放出来,把硬件间的差异交给了GDI处理。GDI通过将应用程序与不同输出设备特性相隔离,使Windows应用程序能够毫无障碍地在Windows支持的任何图形输出设备上运行。例如,我们可以在不改变程序的前提下,让能在Epson点式打印机上工作的程序也能在激光打印机上工作。它把windows系统中的图形
第 13 章:Spring AI Alibaba MCP 与 Nacos3 — 企业级MCP服务
理解Spring AI Alibaba 框架下的MCP服务与Nacos注册中心整合的必要性,学会Spring AI Alibaba-基于Nacos的MCP实现方法
OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战
【代码】OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战。
基于Visual C++.NET的GDI+编程快速入门
工具软件 办公软件 操作系统 网络安全 设计在线 程序开发 教程宝典 软件下载 软件论坛 GDI+编程快速入门 ⊙技术专题精选Visual C++.NET编程基础讲座 完美的C++:C++/CLIC#开发终端式短信的原理和方法DirectShow编程实战音视频精选⊙相关文章 最新推荐 基于Visual C++.NET的GDI+编程快速入门 GDI+是图
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!






= [m11x+m21y+dx m12x+m22y+dy 1]

1257



被折叠的 条评论
为什么被折叠?



