现在的位置: 首页 > 综合 > 正文

API之绘图

2018年02月16日 ⁄ 综合 ⁄ 共 15456字 ⁄ 字号 评论关闭

组成GDI的几百个函数呼叫可以分为几大类:

1取得(或者建立)和释放(或者清除)设备内容的函数

取得有关设备内容信息的函数

绘图函数

设定和取得设备内容参数的函数

使用GDI对象的函数

GDI基本图形

    您在屏幕或打印机上显示的图形型态本身可以被分为几类,通常被称为「基本图形」,它们是:

1、直线和曲线

2、填区域当一系列直线或者曲线封闭了一个区域时,该区域可以使用目前GDI画刷对象进行填图。这个画刷可以是实心色彩、图案(可以是一系列的水平、垂直或者对角标记)或者是在区域内垂直或者水平重复的位图图像。

3位图

4、文字

 

获取设备描述表的方(即获得DC)

1、在处理WM_PAINT消息时,使用BeginPaint 和 EndPaint

   hdc = BeginPaint ( hwnd , & ps ) ;

   ...........................

   EndPaint ( hwnd , & ps ) ;

  变量ps是型态为PAINTSTRUCT的结构,该结构的hdc字段是BeginPaint传回的设备内

  容句柄。 PAINTSTRUCT结构又包含一个名为rcPaint的RECT(矩形)结构,rcPaint定

  义一个包围窗口显示区域无效范围的矩形。使用从BeginPaint获得的设备内容句柄,只能

  在这个区域内绘图。BeginPaint呼叫使该区域有效

 

2、在处理非WM_PAINT 消息时

   hdc=GetDC(hwnd) ;

   ...............................

   ReleaseDC( hwnd , hdc ) ;

   这个设备内容适用于窗口句柄为hwnd的显示区域。这些呼叫与BeginPaint和EndPaint   

   的组合之间的基本区别是,利用从GetDC传回的句柄可以在整个显示区域上绘图。当然, 

   GetDC和ReleaseDC不使显示区域中任何可能的无效区域变成有效

   Windows程序还可以取得适用于整个窗口(而不仅限于窗口的显示区域)的设备内容句

   柄:

 

   hdc = GetWindowDC (hwnd) ; 

   .....................

         

   ReleaseDC (hwnd, hdc) ; 

   这个设备内容除了显示区域之外,还包括窗口的标题列、菜单、滚动条和框架(frame)。

   GetWindowDC函数很少使用,如果想尝试用一用它,则必须拦截处理WM_NCPAINT消

   ,Windows使用该消息在窗口的非显示区域上绘图。

3、CreateDC

   取得设备内容句柄的另一个更通用的函数是CreateDC

   例如,您可以通过下面的呼叫来取得整个屏幕的设备内容句柄:

   hdc = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ; 

 

 

 

其它部分

1、映像模式和变换

2、MetafileMetafile是以二进制形式储存的GDI命令集合。

3、区域绘图区域是形状任意的复杂区域,通常定义为较简单的绘图区域组合。在GDI内部,绘图区域除了储存为最初用来定义绘图区域的线条组合以外,还以一系列扫描线的形式储存。您可以将绘图区域用于绘制轮廓、填入图形和剪裁。

4路径路径是GDI内部储存的直线和曲线的集合。路径可以用于绘图、填入图形和剪裁,还可以转换为绘图区域

5、剪裁绘图可以限制在显示区域的某一部分中,这就是所谓的剪裁。剪裁区域是不是矩形都可以,剪裁通常是通过区域或者路径来定义的。

6、调色盘自订调色盘通常限于显示256色的显示器。Windows仅保留这些色彩之中的20种以供系统使用,您可以改变其它236种色彩,以准确显示按位图形式储存的真实图像。第十六章会讨论调色盘。

  

7、打印虽然本章限于讨论视讯显示,但是您在本章中所学到的全部知识都适用于打印。

画线函数

7、画线函数

Windows可以画直线、椭圆线(椭圆圆周上的曲线)和贝塞尔曲线。Windows 98支援的7个画线函数是:

LineTo 画直线。

  

Polyline和PolylineTo 画一系列相连的直线。

  

PolyPolyline 画多组相连的线。

  

Arc 画椭圆线。

  

PolyBezier和PolyBezierTo 画贝塞尔曲线。

  

另外,Windows NT还支持3种画线函数:

ArcTo和AngleArc 画椭圆线。

  

PolyDraw 画一系列相连的线以及贝塞尔曲线。

  

这三个函数Windows 98不支援。

8、画带边缘的填入图形的函数

Windows中七个用来画带边缘的填入图形的函数列于表5-3中。

表5-3

 

函数

图形

Rectangle

直角矩形

Ellipse

椭圆

RoundRect

圆角矩形

Chord

椭圆周上的弧,两端以弦连接

Pie

椭圆上的饼图

Polygon

多边形

PolyPolygon

多个多边形

9、使用画笔

     画笔决定线的色彩、宽度和线型

     画笔句柄  HPEN 

     使用现有画笔 Stock Pens

     Windows提供三种现有画笔:BLACK_PEN , WHITE_PEN ,NULL_PEN

   调用GetStockObject 可以获得现有的画笔

     hPen =GetStockObject(BLACK_PEN)  ;

     将画笔选进设备DC

     SelectObject(hdc ,hPen) ;

     创建画笔

     hPen = CreatePen(iPenStyle , iWidth , crColor) ;

10、使用画刷

画刷定义:画刷是一个8×8的位图它水平和垂直地重复使用来填充内部区域。它是GDI对  

          象之一。

画刷句柄:HBRUSH

创建画刷对象:???透明画刷????背景方式P158transparent???

    (1) 创建一个颜色逻辑画刷,填充满所有填充的对象

        hBrush=CreateSolidBrush(color);

    (2) 创建影线逻辑画刷 

        hBrush=CreateHatchBrush(iHatchStyle,crColor);

        Hatch marks=影线标记

    (3) 间接创建逻辑画刷

       hBrush=CreateBrushIndirect(&logbrush);

       Logbrush=逻辑画刷;

     typedef struct tag LOGBRUSH { /* lb */ 

                UINT     lbStyle; 

                COLORREF lbColor; 

                LONG     lbHatch; 

                } LOGBRUSH; 

 

     (4)选择windows内部的画刷

       GetStockObject(index));

       在这里stock是储存品的意思,即选择一个已经在windows中定义好的对象。

       7种常用的在windows中定义好的画刷

       BLACE_BRUSH,...WHITEBRUSH,NULL_BRUSH(透明刷子),HOLLOW_BRUSH(空心刷子)

 

       

 将创建的逻辑画刷选入设备描述表

       SelectObject(hdd,bBrush);

 删除创建的逻辑画刷

      DeleteObject(hBrush);

注意:不要删除当前设备描述表中的画刷。

获得画刷信息:

    GetObject(hBrush,sizeof(LOGBRUSH),(LPVOID&logbrush));

9、两种填充方法ALTERNATE 和WINDING

说明:在默认情况下,多边形填入方式是ALTERNATE

   “ALTERNATE和WINDING方式之间的区别很容易察觉。对于ALTERNATE方式,您可以设想从一个无穷大的封闭区域内部的点画线,只有假想的线穿过了奇数条边界线时,才填入封闭区域。”封闭区域指多边形中,一个或多个子封闭区域的一个。假想线需达到所有封闭区域的外部。可以从图形学算法角度理解这种判断方法

    “在WINDING方式下要确定一个封闭区域是否被填入,您仍旧可以设想从那个无穷大的区域画线。如果假想的线穿过了奇数条边界线,区域就被填入,这和ALTERNATE方式一样。”绘制多边形时,是一点接一点绘制的,可以以点的先后顺序定义边的方法。

实例APIDRAW001设置填充模式绘制五角星

矩形函数

矩形结构 RECT 它包括四个成员变量:它包含有4个字段:left、top、right和bottom。这个结构中的坐标被当作逻辑坐标。

操作RECT结构

 1填写字段方法之一:

   rect.left = xLeft ; rect.top = xTop ; rect.right = xRight ; rect.bottom = xBottom 

  填写字段方法之二

   SetRect ( .......... ) 

  2OffsetRect (&rect, x, y) ; 将矩形沿x轴和y轴移动几个单元

  3InflateRect (&rect, x, y) ;增减矩形的尺寸

  4SetRectEmpty (&rect)   矩形各字段设定为0

  5CopyRect (&DestRect, &SrcRect) 将矩形复制给另一个矩形

  6IntersectRect (&DestRect, &SrcRect1, &SrcRect2)    取得两个矩形的交集

  7UnionRect (&DestRect, &SrcRect1, &SrcRect2) 取得两个矩形的联集

  8bEmpty = IsRectEmpty (&rect) ;确定矩形是否为空:

  9bInRect = PtInRect (&rect, point) ;确定点是否在矩形内

您可以用下列叙述来替代CopyRect函数呼叫:DestRect = SrcRect ; 

三个填充矩形函数

FillRect (hdc, &rect, hBrush) ; 用指定画刷来填入矩形(直到但不包含right和bottom坐标),该函数不需要先将画刷选进设备内容。

FrameRect (hdc, &rect, hBrush) ; 使用画刷画矩形框,但是不填入矩形。使用画刷画矩形看起来有点奇怪,因为对于我们所介绍过的函数(如Rectangle),其边线都是用目前画笔绘制的。FrameRect允许使用者画一个不一定为纯色的矩形框。该边界框为一个逻辑单位元宽。如果逻辑单位大于设备单位,则边界框将会为2个图素宽或者更宽。

InvertRect (hdc, &rect) ; InvertRect将矩形中所有图素翻转,1转换成0,0转换为1,该函数将白色区域转变成黑色,黑色区域转变为白色,绿色区域转变成洋红色。

/////////////////////////////////////////////////////////////

区域

1、区域概念:区域是对显示器上一个范围的描述,这个范围是矩形、多边形和椭圆的组合。

2、区域的句柄,型态为HRGN。与画笔、画刷和位图一样,区域是GDI对象,您应该呼叫DeleteObject来删除您所建立的区域。

3、区域剪裁原理:区域可以用于绘制和剪裁,通过将区域选进设备内容,就可以用区域来进行剪裁(就是说,将可以绘图的范围限制为显示区域的一部分)

4、填充区域函数

   1、填充任意形状的区域的函数

      FillRgn(.......);

4.1创建矩形区域

  最简单的区域是矩形,有两种创建方法

 (1)hRng(HRNG,区域对象的句柄) =CreateRectRgn(xLeft,yTop,xRight,yBottom);

 (2)hRng=CreateRectRgnIndirect(&rect);

4.2 创建椭圆区域

   (1)hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ; 

   (2)hRgn = CreateEllipticRgnIndirect (&rect) ; 

4.3CreateRoundRectRgn建立圆角的矩形剪裁区域

4.4建立多边形区域的函数类似于Polygon函数:

  CreatePolygonRgn (&point, iCount, iPolyFillMode) ; 

4.5利用CombineRgn (hDestRgn, hSrcRgn1, hSrcRgn2, iCombine) 建立复杂区域。显示区域的强大能力。

这一函数将两个区域(hSrcRgn1和hSrcRgn2)组合起来并用句柄hDestRgn指向组合成的剪裁区域。这三个区域句柄都必须是有效的,但是hDestRgn原来所指向的区域被破坏掉了(当您使用这个函数时,您可能要让hDestRgn在初始时指向一个小的矩形剪裁区域)。

iCombine参数说明hSrcRgn1和hSrcRgn2如何组合,见表5-9。

表5-9

 

iCombine

新剪裁区域

RGN_AND

两个区域的公共部分

RGN_OR

两个区域的全部

RGN_XOR

两个区域的全部除去公共部分

RGN_DIFF

hSrcRgn1不在hSrcRgn2中的部分

RGN_COPY

hSrcRgn1的全部(忽略hSrcRgn2)

从CombineRgn传回的iRgnType值是下列之一:NULLREGION,表示得到一个空区域;SIMPLEREGION,表示得到一个简单的矩形、椭圆或者多边形;COMPLEXREGION,表示多个矩形、椭圆或多边形的组合;ERROR,表示出错了。

 

//运行结果,见下图

 

结果图

 

抱歉!评论已关闭.