没有合适的资源?快使用搜索试试~ 我知道了~
首页GDI+ SDK教程:Windows绘图接口详解与实例
GDI+ SDK参考教程是一份详尽的Windows应用绘图接口GDI+教学材料,主要针对C#和C++编程者设计。GDI+是Microsoft为Windows平台提供的一种高级图形处理API,它基于类的接口架构,旨在简化图形创作和渲染,提升应用的图形表现力。 本教程从序言开始,介绍了教程的目标和适用范围,适合希望通过GDI+进行高效图形编程的开发人员。它涵盖了多种主题,包括但不限于: 1. 安全注意事项:在使用GDI+时,强调了构造函数调用的成功验证、内存管理和错误校验的重要性,确保代码的健壮性。 2. 线程同步:由于GDI+操作可能涉及多个线程,教程解释了如何正确地同步以防止并发问题。 3. GDI+概述:阐述了GDI+的组成,包括钢笔、线条、曲线、图形、路径、画刷、图元文件等核心组件。 4. 矢量图形:详细讲解了矢量图的基础概念,如钢笔控制、不同类型的形状绘制方法,以及开放与闭合曲线、区域和裁剪等技术。 5. 图像处理:涵盖了位图和图元文件的处理,包括加载、显示、剪裁、缩放、旋转、解码编码等高级操作,以及Alpha混合和透明度控制。 6. 性能优化:提供了如使用高速缓存位图、避免自动缩放和读取元数据等技巧,以提升应用程序的图形性能。 7. 实例演示:教程还包含丰富的实战示例,如绘制线条、字符串、使用钢笔绘制形状、填充图形,以及各种图像操作的代码实现,便于读者理解和实践。 这份教程旨在帮助开发者全面掌握GDI+工具,无论是初级学习者还是经验丰富的程序员都能从中获益,以提升他们的Windows图形应用程序开发能力。
资源详情
资源推荐
-16-
Graphics 对象和设备场景一样,与屏幕上的特定窗体有关,它包含着图形绘制的有关属性信息(比
如,平滑模式和隐式文本渲染)。然而,Graphics 对象并没有像 GDI 那样与 Pen、Path、Image 或者
Font 等搅在一起。比如,在 GDI 中,您必须先调用 SelectObject 将一个 Pen 对象与设备场景关联,然
后您才能使用设备场景绘制一条线。这被称为将画笔选入设备场景。您在设备场景中绘制的所有线条都将
采用这个画笔直到您选择另一个画笔为止。在 GDI+中,您 只 需 将一个 Pen 对象作为参数传递给 Graphics
类的 DrawLine 方法即可。您可以在一连串的 DrawLine 调用中传入不同的 Pen 对象,而不必将给定的
Pen 对象与 Graphics 对象关联。
· 画线的 2 种方法
下面两个例子都是从位置(20,10)到位置(200,100)绘制一条宽度为 3 的红色线条。前一个例子采
用 GDI 调用,第二个例子通过 C++类接口调用 GDI+。
o DrawingalinewithGDI
采用 GDI 画线,您需要 2 个对象:设备场景和画笔。您通过调用 CreatePen 获取一个句柄。紧接着,
您调用 SelectObject 将画笔选入设备场景。然后调用 MoveToEx 将画笔位置设为(20,10),然后调用绘
制一条直线到位置(200,100)。注意 MoveToEx 和 LineTo 均需要一个 hdc 作为参数。
HDC hdc;
PAINTSTRUCTps;
HPEN hPen;
HPEN hPenOld;
hdc=BeginPaint(hWnd,&ps);
hPen=CreatePen(PS_SOLID,3,RGB(255,0,0));
hPenOld=(HPEN)SelectObject(hdc,hPen);
MoveToEx(hdc,20,10,NULL);
LineTo(hdc,200,100);
SelectObject(hdc,hPenOld);
DeleteObject(hPen);
EndPaint(hWnd,&ps);
o 采用 GDI+和 C++类接口画线
通过 GDI+和 C++类接口画线,您需要一个 Graphics 对象和一个 Pen 对象。注意您不需要向这些
对象提供窗体句柄。相反,您只需要构造一个 Graphics 类(一个 Graphics 对象)和一个 Pen 类(一个
Pen 对象)即可。画线涉及 Graphics 类的 Graphics::DrawLine 方法。Graphics::DrawLine 方法的
第一个参数是一个 Pen 对象的指针。较之前面将 Pen 选入设备场景的 GDI 例子,这种方案更加更加简单
灵活。
HDC hdc;
PAINTSTRUCTps;
Pen* myPen;
Graphics* myGraphics;
hdc=BeginPaint(hWnd,&ps);
myPen=newPen(Color(255,255,0,0),3);
-17-
myGraphics=newGraphics(hdc);
myGraphics->DrawLine(myPen,20,10,200,100);
deletemyGraphics;
deletemyPen;
EndPaint(hWnd,&ps);
· 钢笔、画刷、路径、图形和字体作为参数
前面的例子说明了 Pen 对象可以独立于 Graphics 对象被创建和保留,该对象提供具体绘图方式。
同样地,画刷、图形路径、图象和字体对象可以独立于 Graphics 对象被创建和保留。Graphics 类提供
的许多绘图方法都接受 Brush、GrpahicsPath、Image 或者 Font 对象作为参数之一。例如,一个 Brush
对象的地址作为参数传递给 FillRectangle 方法,而一个 GraphicsPath 对象的地址作为参数传递给
DrawPath 方法。类似地,Image 和 Font 对象的地址传递给 DrawImage 和 DrawString 方法。这与
GDI 中需要先选入一个画刷、路径、图象或者字体到指定设备场景,然后再将设备句柄作为参数传递给绘
图函数的方法相比形成了强烈对比。
· 方法重载
许多 GDI+方法被重载了;也就是说,存在不同的方法,它们拥有相同的函数名和不同的参数列表。
例如,Graphics 类的 DrawLine 方法有以下几种形式:
StatusDrawLine(INconstPen*pen,
INREALx1,
INREALy1,
INREALx2,
INREALy2);
StatusDrawLine(INconstPen*pen,
INconstPointF&pt1,
INconstPointF&pt2);
StatusDrawLine(INconstPen*pen,
ININTx1,
ININTy1,
ININTx2,
ININTy2);
StatusDrawLine(INconstPen*pen,
INconstPoint&pt1,
INconstPoint&pt2);
所有上面 DrawLine 方法的四种变体都接受一个 Pen 对象指针、起点坐标和终点坐标。前两个方法
接受浮点数字型的坐标参数,而后面两个方法接受整数类型的坐标参数。第一个和第三个方法接受由数字
分隔开的坐标;第二个和第四个方法接受由一对 Point(或者 PointF)对象表示的坐标。
· 不再有当前位置
-18-
注意,前面显示的 DrawLine 方法同时提供了线段的起点和终点作为参数。不同的是,在 GDI 中您
必须先设置当前位置然后才能绘制一个起于(x1, y1)终于(x2, y2)的线段。GDI+中已经完全摒弃了当前
位置的概念。
· 绘图与填充方法分离
在绘制图形比如矩形的边框和填充其内部区域方面,GDI+比 GDI 更加灵活。GDI 有个 Rectangle
函数可以一步实现绘制矩形和填充其内部区域。边框采用当前选入的画笔绘制,内部区域采用当前选入的
笔刷填充。
hBrush=CreateHatchBrush(HS_CROSS,RGB(0,0,255));
hPen=CreatePen(PS_SOLID,3,RGB(255,0,0));
SelectObject(hdc,hBrush);
SelectObject(hdc,hPen);
Rectangle(hdc,100,50,200,80);
在GDI+中,绘制矩形边框和填充其内部区域的方法是独立开来的。Graphics 类的 DrawRectangle
方法有一个参数,用于传入 Pen 对象的地址。而 FillRectangle 方法有一个参数,用于传入 Brush 对象
的地址。
HatchBrush*myHatchBrush=newHatchBrush(
HatchStyleCross,
Color(255,0,255,0),
Color(255,0,0,255));
Pen*myPen=newPen(Color(255,255,0,0),3);
myGraphics.FillRectangle(myHatchBrush,100,50,100,30);
myGraphics.DrawRectangle(myPen,100,50,100,30);
注意,GDI+中 FillRectangle 和 DrawRectangle 方法的参数指定矩形的左、上、宽度和高度。相
对地,在 GDI 的 Rectangle 函数中,参数指定的是矩形的左、右、上、下。同时还要注意,GDI+中的
Color 类的构造函数有 4 个参数。后面的 3 个参数就是通常的红、绿、蓝的值;第一个参数指定的是α半
透明值,它表示该颜色与背景色混合的程度。
· 构造区域
GDI 提供了几个函数可以创建区域:CreateRectRgn、CreateEllpticRgn、CreateRoundRectRgn、
CreatePolygonRgn 和 CreatePolyPolygonRgn。您可能也期望 GDI+中的 Region 类提供类似的构造
函数,传入矩形、椭圆、圆角矩形和多边形作为参数,但是情况并非如此。在 GDI+中,Region 类提供
一个传入 Rect 对象引用的构造函数,和另一个传入 GraphicsPath 对象地址的构造函数。如果您想创建
一个基于椭圆、圆角矩形或者多边形的区域,您可以很容易地通过创建一个 GraphicsPath 对象(包含椭
圆等),然后将 GraphicsPath 对象的地址传递给 Region 构造函数即可。
在 GDI+中可以很简单地通过图形和路径的组合创建一个复杂的区域。Region 类有 Union 和
Intersect 方法,用于加入一个路径或者另一个区域到一个已有区域中。GDI+中一个很好的特性是,当一
个 GraphicsPath 对象作为 Region 构造函数的参数传入的时候,它本身并不会被销毁。而在 GDI 中,
-19-
您可以通过 PathToRegion 函数将一个路径转换为一个区域,但是同时路径也被销毁了。同样地,
GraphicsPath 对象在其地址作为 Union(合并)和 Intersect(相交)方法的参数传入时本身也不会被
销毁,因此您可以将一个指定的路径作为一个组成部分来创建几个独立的区域。下面例子中,假设 onePath
是
一个 GraphicsPath 对象(简单抑或复杂)的指针并且已经被初始化:
Regionregion1(rect1);
Regionregion2(rect2);
region1.Union(onePath);
region2.Intersect(onePath);
线条、曲线和图形
GDI+的矢量图部分用于绘制线条、绘制曲线,绘制和填充图形。
矢量图概览
MicrosoftWindowsGDI+在一个坐标系统中绘制线条、矩形和其他图形。您可以选择各种不同的
坐标系统,但是默认的坐标系统规定其左上角位置为起点,X 轴指向右边、Y 轴之指向下边。默认坐标系
统的度量单位是象素(Pixel)。
电脑显示器在一个矩形点阵上创建其显示画面,这 些 点 称 为图 片要素或者象素。不同的显示器其在屏
幕上显示的点数不尽相同,并且通常一个独立显示器其显示的象素总数可以由用户进行调节。
在您采用 GDI+绘制线条、矩形和曲线的时候,您需要提供一些关于绘制对象的关键性信息。例如,
您可以通过 2 点确定一条线段,您可以通过一个点、高度和宽度确定一个矩形。GDI+与显示器驱动程序
-20-
协同工作,来判断哪个象素应该开启用于显示线条、矩形和曲线。下面所示,显示一条从点(4,2)到点(12,
8)的线条的象素情况。
总的来说,某些基本的构成块已经证明是最对建立二维图形非常有用。这些基本构成块,GDI+均支
持,包括:
o Lines (线条)
o Rectangles (矩形)
o Ellipses (椭圆)
o Arcs (弧形)
o Polygons (多边形)
o Cardinalsplines (基数样条)
o Béziersplines (贝塞尔样条)
GDI+中的 Graphics 类提供这些方法来绘制前面列表中的对象:DrawLine、DrawRectangle、
DrawEllipse、DrawPolygon、DrawArc、DrawCurve(用于基数样条)和 DrawBezier。每个方法都已
被重载;也就是说,每种方法都以不同参数列表的变体出现。例如,DrawLine 方法的一个变体接受一个
Pen 对象的地址和四个整型值,而它的另一个变体则接受一个 Pen 对象地址和两个 Point 对象引用。
绘制线条、矩形和贝塞尔样条的方法都有其复数形式的伴随方法,这 些方 法在一 次 调用中绘制多个项
目:DrawLines、DrawRectangles 和 DrawBeziers。同样地,DrawCurve 方法也有一个伴随方法
DrawClosedCurve,该函数通过连接曲线的起点和终点创建一个闭合图形。
所有的 Graphics 类的方法都得配合 Pen 对象使用。因此,为了绘制任何东西,您必须至少创建 2
个对象:一个 Graphics 对象和一个 Pen 对象。Pen 对象存储诸如线条宽度、颜色等绘图属性。Pen 对
象的地址将作为一个参数传递给绘图方法。例如,一个 DrawRectangle 方法的变体需要传入一个 Pen
对象地址和 4 各整数值作为参数,该方法绘制一个左上角为(20,10)、宽度为 100、高度为 50 的矩形。
myGraphics.DrawRectangle(&myPen,20,10,100,50);
钢笔、线条和矩形
采用 GDI+绘制线条需要一个 Graphics 对象和一个 Pen 对象。Graphics 对象提供实际的绘图方法,
而 Pen对象存储线条属性,例如颜色、宽度和样式等。绘制线条只需要简单调用 Graphics 对象的 DrawLine
方法即可。Pen 对象的地址作为参数之一传递给 DrawLine 方法。下面的例子是绘制一条从点(4,2)到点
(12,6)的线段。
剩余175页未读,继续阅读
微山寒叶
- 粉丝: 3
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 十种常见电感线圈电感量计算公式详解
- 军用车辆:CAN总线的集成与优势
- CAN总线在汽车智能换档系统中的作用与实现
- CAN总线数据超载问题及解决策略
- 汽车车身系统CAN总线设计与应用
- SAP企业需求深度剖析:财务会计与供应链的关键流程与改进策略
- CAN总线在发动机电控系统中的通信设计实践
- Spring与iBATIS整合:快速开发与比较分析
- CAN总线驱动的整车管理系统硬件设计详解
- CAN总线通讯智能节点设计与实现
- DSP实现电动汽车CAN总线通讯技术
- CAN协议网关设计:自动位速率检测与互连
- Xcode免证书调试iPad程序开发指南
- 分布式数据库查询优化算法探讨
- Win7安装VC++6.0完全指南:解决兼容性与Office冲突
- MFC实现学生信息管理系统:登录与数据库操作
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功