GDI+入门——带你走进Windows图形的世界

一、GDI+基础

1.GDI+简介

GDI+是微软的新一代二维图形系统,它完全面向对象,要在Windows窗体中显示字体或绘制图形必须要使用GDI+。GDI+提供了多种画笔、画刷、图像等图形对象,此外还包括一些新的绘图功能,比如渐变、除锯齿、纹理等。

GDI+包括三部分:二维矢量图形的绘制、图像处理和文字显示。GDI+使用的各种类大都包含在命名空间system::Drawing中。

2.常用的数据结构

在使用GDI+显示文字和绘制图形时,需要用到一些数据结构,例如Size、Point、Rectangle等,他们在命名空间System::Drawing中定义,都属于值类型(结构类型)。

(1)Point结构

Point结构代表Windows窗体应用程序中的一个二维表面上的位置,常用于定义窗体或控件的位置,表示一个点的坐标值,有X和Y两种属性。

可利用IsEmpty属性检测Point结构是否为空,为空则返回true。可直接对Point变量进行+、-、==、!=运算以及Point值与Size值的加减操作。

PointF结构类似于Point结构,区别是它的坐标是浮点值。PointF值可通过Point结构包含的3钟静态方法转换成Point值

(2)Size结构

Size结构用于定义Windows窗体应用程序中的窗口、控件和其他矩形区域的大小。具有宽度Width和Height属性,也可以使用IsEmpty属性来检测Szie是否为空。

初始化:Size b=Size(50,100);或者通过一个Point变量初始化:Size c=Size(Point(100,20));

SzieF结构与Size结构类似

(3)Rectangle结构

保存一个矩形区域的位置和大小,包含X、Y、Width、Height、Szie等属性值。

初始化:指定一个Point和Size值,如:Rectangle b=Rectangle(point1,size1);或者直接指定矩形位置、宽度和高度值,前两个参数指定了矩形左上角的XY值,后两个参数指定矩形的宽度高度

方法:

·Contains方法:确定一个矩形或一个点是否在当前矩形区域内。参数类型可以是Point结构,Rectangle结构和点坐标值。

·Union方法:求两个矩形的并集。参数是两个矩形,返回一个包含其并集的Rectangle结构。

·Intersect方法:求两个矩形的交集。参数为两个矩形,返回Rectangle结构,参数为一个矩形时,则获取当前矩形与参数矩形的交集。

绘制一个空间的工作区时,常常用Rectangle结构。Form类中有一个ClientRectangle属性,用于获取工作区的位置,Rectangle myRect=ClientRectangle;窗体的可视化区域为工作区的大小减去状态栏的大小。

RectangleF结构与Rectangle结构类似。

二、Graphics对象

1.简介

在传统的Windows窗口中,使用Device Context即设备上下文来进行绘图操作,而在.NET框架的Windows窗体中使用绘图对象进行绘图操作。使用System::Drawing命名空间中的Graphics类封装GDI+绘图对象,在Windows窗体中的所有绘图操作都必须通过这个类进行,Graphics类就相当于MFC中的CDC类。要使用Graphics进行绘图,首先必须获得它的对象实例或是创建一个Graphics对象。最常用的方法是可以通过窗体的Paint时间来获取对象实例,创建对象则通过CreateGraphics方法。

2.Graphics类提供许多绘图方法:

·Clear方法:使用一种指定颜色填充整修绘图表面。

·DrawCloseCurve:绘制闭合曲线。

·DrawCurve:绘制曲线。

·DrawImage:绘制图像。

3.Graphics对象创建方法:

(1)在窗体或控件的 Paint 事件中接收对图形对象的引用,作为 PaintEventArgs 的一部分。在为控件创建绘制代码时,通常会使用此方法来获取对图形对象的引用。

(2)调用某控件或窗体的 CreateGraphics 方法以获取对 Graphics 对象的引用,该对象表示该控件或窗体的绘图图面。如果想在已存在的窗体或控件上绘图,请使用此方法。

(3)由从 Image 继承的任何对象创建 Graphics 对象。此方法在您需要更改已存在的图像时十分有用。

三、颜色Color

GDI+中用值类型Color结构来表示颜色,在类和方法中要使用颜色的时候,需要Color结构的一个实例。Color结构中预定义了141中颜色,它们都使用静态属性来表示。

1.创建Color对象实例的方法:

·通过一个静态属性返回:Color newColor=Color::Red;

·使用默认的构造函数创建Color实例,但是产生的Color对象是纯黑色的,并且不可修改

·调用FormArgb静态方法,Color sky=Color::FormArgb(100,200,200,255);参数依次为alpha成分,红,绿,蓝。alpha缺省即为最大值,即完全不透明

·使用FormKnownColor静态方法,参数为KnownColor枚举类型的值。例如:Color sky=Color::FormKnownColor(KnownColor::Blue);

·调用FormName静态方法,参数是一个字符串,这个字符串是KnownColor枚举值的名称。如,Color sky=Color::FormName(“Blue”);

2.Color属性

Color有4个只读属性,分别alpha、红色、绿色、蓝色

Windows系统使用一些系统范围的颜色,如活动边框的颜色和标题栏颜色等。.NET框架为这些系统颜色提供了一个封装类——SystemColors,各种系统颜色以静态属性的形式保存在这个类中,可以直接通过类名引用

四、字体

在窗体和控件中都包含有Font属性,表示窗体或控件当前使用的字体,当窗体或控件创建时,会使用系统的默认字体值。

字体使用Drawing::Font类封装,通过创建这么个类的实例可以创建新的字体。

1.Font构造函数:

·下面语句创建一个12磅的粗体隶书字体,Font^ font1=gcnew Font(“隶书”,12,FontStyle::Bold);

·下面语句使用指定的度量单位而不是磅值创建字体,Font^ font2=gcnew Font(“隶书”,12,GraphiUnit::Document);

·组合上述两个构造函数,Font^ font3=gcnew Font(“隶书”,12,FontStyle::Bold,GraphiUnit::Document);

2.GraphiUnit枚举类型,用于指定给定数据的度量单位

·Display,将1/75英寸指定无味度量单位

·Docunment,将文档单位指定为度量单位

不一一列举

3.FontStyle枚举类型定义字体风格

·Bold,粗体

·Italic,斜体

·Regular,常规字体

·Underline,带下划线

五、画笔

画笔用Pen类型封装,用于绘制图形。可以使用这个类来创建一个指定颜色、默认宽度的画笔对象。

1.Pen构造函数

·通过参数指定画笔颜色,宽度为默认1,Pen^ penRed=gcnew Pen(Color::Red);

·指定画笔颜色和宽度,Pen^ penRed=gcnew Pen(Color::Red,10);

·参数使用画刷来指定画笔格式,Pen^ penRed=gcnew Pen(brushRed);

·参数使用画刷来指定画笔模式及宽度,Pen^ penRed=gcnew Pen(brushRed,5);

2.Pen类型常用属性

·Alignment,指定Pen对象的对齐方式;是一个PenAlignment枚举值。

·Brush,获取或设置用于确定此 Pen对象的属性的 Brush对象 ;

·Color,获取或设置画笔颜色;

·EndCap,指定线条末端出现的形状。这是一个LineCap枚举值,默认为LineCap::Flat。

·LineJoin,指定此 Pen对象绘制的两条连续直线终点之间的联接样式。这是一个LineJoin枚举值。

·PenType,获取用此 Pen对象绘制的直线的样式,是一个 PenType枚举值。

·StartCap,指定线条起点出现的形状。默认为LineCap::Flat。

·Width,获取或设置画笔绘制的线条的宽度。

3.画笔的使用

SystemPens类,Windows系统颜色画笔,用于创建与用户界面和系统颜色想匹配的笔,它的每个静态属性都返回一个Pen对象。下面这行语句创建一个Pen对象,将它初始化为用户加亮显示文本时首选的颜色。

Pen^ highlightPen = SysternPens::HighlightText;

SystemPens类的静态属性

·Control,控件背景颜色;

·ActiveCaptionText,活动窗口标题栏的文本颜色;

·HighlightText,加亮显示的文本颜色;

·WindowText,窗口的文本颜色;

·WindowFrame,窗口的图文框颜色。

Pens类提供了很多定义颜色的画笔对象,它们以静态属性的形式保存。例如要创建一个红色画笔,可以调用Pens ::Red属性,例如,Pen^ penRed=Pens::Red;

六、画刷

显示文字除了指定字体外,还有指定画刷,另外在图形填充时也要使用画刷,同时画笔也可以基于画刷来创建。Brush类是一个抽象类。不能直接用来创建画刷实例,在System::Drawing命名空间中定义了两个最基本的画刷:SolidBrush和TextureBrush。

SolidBrush类,使用一种纯色来填充区域;创建方法:SoildBrush^ skyBrush=gcnew SoildBrush(Color::Blue);只有一个Color属性,用于获取或设置画刷颜色。

TextureBrush类,使用一个图像来填充区域;方法:TextureBrush^ br=gcnew TextureBrush(“C:\image1.bmp”);

(1)画刷的使用,可使用静态属性直接引用:Brush^ brushRed=Brush::Red;

(2)系统颜色画刷SystemBrushes类,这些画刷也作为静态属性在SystemBrushes中保存

七、显示文字

Windows窗体程序中文字的显示通过Graphics类的DrawingString方法进行,调用这个方法需要指定显示的字符串、字体、画刷以及显示的位置

代码示例:

Image^ img=Image::FormFile(“sample.jpg”);

TextrueBrush^ tb=gcnew TextureBrush(img);

Graphics^ gg=e->Graphics;

gg->DrawString(“VS2005”,f,tb,10,80);

可以使用StringFormat对象来改变文字显示方向,作为一个参数放在位置参数后面

八、显示文字

使用Image类封装基本的图像操作。Image是个抽象基类,不能直接用来创建对象实例。提供了几个静态方法从文件中载入图像,如FomrFile和FromStream方法,支持多种图像文件格式(bmp、jpg、gif等)。

可以在显示图像时进行缩放操作。比如说可以使用一个Rectangle变量指定位图位置和大小。

Rectangle^ rec=gcnew Rectangle(10,10,100,100);

this->CreateGraphics()->DrawImage(bmp,rec);

九、Paint事件

所有绘图操作都是通过响应窗体或空间的Paint事件来进行处理的。几乎所有的窗体和控件类都包含这个事件。

Paint事件的代理类型为PaintEventHandle,事件参数类型为PaintEventArgs。在这个参数中包含了两个在处理Paint事件方面十分重要的属性:

·ClipRectangle,获取要在其中进行会话的矩形。

·Graphics,返回一个Graphics类实例,用于输出。

窗体和控件类提供了OnPaint虚拟方法来更方便地处理Paint事件,当触发Paint事件时会自动调用这个方法

GDI+入门——带你走进Windows图形的世界,布布扣,bubuko.com

时间: 2024-10-17 02:00:42

GDI+入门——带你走进Windows图形的世界的相关文章

走进windows编程的世界-----绘图相关

Windows绘图 1 图形绘制      1.1 图形绘制的方式      获取到绘图句柄-设备描述表(DC),使用相应的绘图的API,在设备上绘制图形.          1.2 颜色      R\G\B三色, 每种颜色8位, 共24位颜色.      32位颜色: 颜色数量24位颜色, 多出来的8位表示灰度.      16位: 颜色数量2的16次方.            Win32下,颜色的定义 COLORREF(DWORD), RGB宏定义颜色       COLORREF nCo

走进windows编程的世界-----消息处理函数(2)

一 WM_PAINT消息 1 WM_PAINT的产生   由于窗口的互相覆盖等,产生需要绘制的区域,那么会产生WM_PAINT消息.   一般情况下,不直接发送WM_PAINT消息,通过API声明需要绘制区域,来产生WM_PAINT消息.   例如,可以使用InvalidateRect声明一个需要重新绘制的区域.    2 WM_PAINT的注意点    2.1 如果一个消息队列中,有多个WM_PAINT消息,只有最后一个WM_PAINT消息会被处理.    2.2 WM_PAINT消息处理中,

走进windows编程的世界-----windows进程

Windows进程  1 Windows进程    进程是一个容器,包含了一个应用程序实例的各种资源.Windows多任务的操作系统,因此可以同时执行多个进程.      2 Windows进程的一些特点    2.1 进程中包含了执行代码等资源.    2.2 进程都具有私有的地址空间.    2.3 每个进程都有一个ID,标识进程.    2.4 每个进程都有自己的安全属性    2.5 至少要包含一个可以执行的线程.    二 进程的环境 1 环境信息的获取    获取:    LPVOI

走进windows编程的世界-----消息处理函数(1)

Win32消息机制 过程驱动:程序是按照我们预先定义好的顺序执行,每执行一步,下一步都已经按照预定的顺序 继续执行,直至程序结束. 事件驱动:程序的执行顺序是无序的.某个时间点所执行的代码,是由外界 通知.由于我们无法决定程序执行顺序.所以代码的执行也是无序的. Win32基本消息 WM_DESTROY:       窗口销毁时的消息,可以做退出或善后处理 WM_CREATE:       窗口创建消息,是在窗口创建后,窗口处理函数收到的第一条消息   可以在这个消息内,做初始化或者穿件子窗口

走进windows编程的世界-----字符编码

1   字符编码 1.1编码的历史 1.1.1ASCII码 0=127 7位表示 1.1.2ASCII扩展码 0-255 8为表示. 代码页:通过代码也来切换对应的字符(数字表示) 1.1.3双字节字符集DBCS 使用一个或两个字节表示字符. 1.1.4Unicode编码 全部使用2个字节表示字符 内存 硬盘等资源占用变大.对编码支持度大. 字符集 1.2C 语言和编码 1.2.1单字节的字符和字符串 Char  cText = 'A'; Char * pszText ="ABCD"

走进windows编程的世界-----消息处理函数(4)

一 右键菜单  1 右键菜单    当在窗口点击鼠标右键时,弹出的菜单.  2 右键菜单的使用    2.1 创建菜单      CreatePopupMenu    2.2 菜单增加     AppendMenu    2.3 菜单的显示. BOOL TrackPopupMenu( HMENU hMenu, //显示的菜单句柄 UINT uFlags, //显示的方式 int x, //菜单的X屏幕坐标 int y, //菜单的Y屏幕坐标 int nReserved, //保留,必须为0 HW

走进windows编程的世界-----消息处理函数(3)

二 定时器消息 1 定时器消息 WM_TIMER   按照定时器设置时间段,自动向窗口发送一个定时器消息WM_TIMER. 优先级比较低.   定时器精度比较低,毫秒级别.消息产生时间也精度比较低.    2 消息和函数   2.1 WM_TIMER  - 消息ID    wParam: 定时器的ID    lParam: 定时器的处理函数 2.2 SetTimer  - 设置一个定时器 UINT SetTimer( HWND hWnd, //窗口的句柄,可以为NULL UINT nIDEven

走进windows编程的世界-----窗口的注册及创建

1   窗口注册和创建 1.1WIN32 窗口程序创建步骤 1.WinMain入口函数的定义 2.WindowProc函数的定义 3.注册窗口类 RegisterClass.RegisterClassEX 4.创建窗口 CreateWindow.CreateWindowEx HWND CreateWindow( LPCTSTRlpClassName,//指向已注册的窗口类的名称的指针 LPCTSTRlpWindowName,//指向窗口名称的指针 DWORDdwStyle,//窗口的风格 int

走进windows编程的世界-----位图及映射模式

1   位图的使用 1.1位图介绍 位图-通过保存在图像上每个点的颜色,生成响应的位图文件. 光栅图:图像点阵的保存 矢量图:绘图命令的保存. 1.2位图的使用 1.             加载位图资源 LoadBitap(); 2.             创建防止位图的DC CreateCompatibleDC 3.             将位图放入创建的DC SlectObject 4.             绘制位图到当前DC中 BitBlt 5.             取出位图