VC6.0图形处理技术和文字处理技术

来源:互联网 发布:php2017行情知乎 编辑:程序博客网 时间:2024/05/18 10:38
 

1  Windows图形设备接口

u      设备描述表属性及相关函数

属性

默认值

相关函数

背景色

WHITE(白色)

GetBkColor

SetBkColor

背景模式

OPAQUE(不透明)

GetBkColor

SetBkColor

位图

NONE

CreateBitMap

CreateBitMapIndirect

CreateCompatibleBitmap

SelectObject

画刷

WHITE_BRUSH

CreateBrushIndirect

CreateDIBPatternBrush

CreateHatchBrush

CreatePatternBrush

CreateSolidBrush

SelectObject

画刷起始位置

(0,0)

GetBrushOrg

SetBrushOrg

UnrealizeObject

剪截域

DISPLAY SURFACE

ExcludeClipRect

IntersectClipRect

OffsetClipRect

SelectClipRect

SelectObject

SelectClipRgn

颜色调色板

DEFAULT_PALETTE

CreatePalette

RealizePalette

SelectPalette

绘图方式

R2_COPYPEN

GetROP2

SetROP2

字体

SYSTEM_FONT

CreateFont

CreateFontIndirect

SelectObject

字符间距

0

GetTextCharacterExtra

SetTextCharacterExtra

映射方式

MM_TEXT

GetMapMode

SetMapMode

画笔

BLACK_PEN

CreatePen

CreatePenIndirect

SelectObject

多边形填充方式

ALTERNATE

GetPolyFillMode

SetPolyFillMode

缩放模式

BLACKONWHITE

SetStretchBltMode

GetStretchBltMode

文本颜色

BLACK

GetTextColor

SetTextColor

视图范围

1,1

GetViewportExtEx

SetViewportExtEx

ScaleViewportExtEx

视图原点

(0,0)

GetViewportOrgEx

SetViewportOrgEx

窗口范围

(1,1)

GetWindowExtEx

SetWindowExtEx

ScaleWindowExtEx

窗口原点

(0,0)

GetWindowOrgEx

OffsetWindowOrgEx

SetWindowOrgEx

 

1.1  图形刷新

u      刷新请求

Windows系统通常通过WM_PAINT消息将刷新请求传递给应用程序。当用户区的内容需要刷新时,系统在应用程序的消息队列中加入该消息,以通知窗口函数执行刷新处理。

 

u      系统对刷新请求的响应

1)       窗口移动后的刷新

ü        用户区移动或现实。

ü        用户窗口大小改变。

ü        程序通过滚动条滚动窗口。

2)       被覆盖区域的刷新

ü        下拉式菜单关闭,并需要恢复被覆盖的部分。

ü        因为清除对话框或消息框对象而需要恢复被覆盖的部分。

3)       对象穿越后的刷新(Windows系统自动完成该刷新任务)

ü        光标穿过用户区。

ü        图标拖过用户区。

 

u      刷新方法

l        在内存中保持一个显示输出的副本,当需要重绘窗口时,将副本复制到相应的窗口中。该方法适用于刷新位图等复杂图形。

l        记录曾经发生的事件,在窗口需要刷新时重新调用窗口执行这个事件。

l        重新绘制图形,一般对于简单图形常采用重新绘制图形方法执行刷新。

 

1.2  获取设备环境

    获取设备环境是应用程序输出图形的先决条件,常用的三种获取设备环境的方法是调用函数BeginPaintGetDCGetDCEx

u      调用BeginPaint函数

应用程序相应WM_PAINT消息进行图形刷新时,主要通过调用BeginPaint函数获取设备环境,其形式为:

PAINTSTRUCT ps;

hdc=BeginPaint(hwnd,&ps); //psPAINTSTRUCT类型结构。

BeginPaint函数获取的设备环境必须用EndPaint函数释放,其原型为:

    BOOL  EndPaint(HWND hwnd,PAINTSTRUCT &ps)

u      调用GetDC函数

如果Windows应用程序的绘图工作并非用WM­­_PAINT消息驱动,则需要调用GetDC函数获取设备环境。其形式为:

        hdc=GetDC(hwnd);

GetDC函数获取的设备环境必须用ReleaseDC函数释放,其原型为:

    intReleaseDC(HWND hwnd,HDC hDC)

u      调用GetDCEx函数(同GetDC

1  BeginPaintGetDC的区别

                函数

项目

BeginPaint函数

GetDCGetDCEx)函数

使用环境

只用于图形刷性时获取设备环境

使用较为广泛

操作区域

使用BeginPaint函数获取设备环境后,操作区域为无效区域

使用GetDC函数获取设备环境后,操作区域为特定窗口的客户区或整个窗口

释放设备环境所用函数

EndPaint函数释放

ReleaseDC函数释放

 

1.3  映射模式

    映射模式:不用考虑输出设备的坐标系统情况,而在一个统一的逻辑坐标系中组成图形的绘制与操作,映射模式定义了将逻辑单位转化为设备的量度单位以及设备的X方向和Y方向。

2  Windows中的映射模式

映射模式

将一个逻辑单位映射为

坐标系设定

MM_ANISOTROPIC

SetWindowExtExSetViewportExtEx函数确定

可选

MM_ISOTROPIC

SetWindowExtExSetViewportExtEx函数确定

可选,但X轴和Y轴的单位比例为11

MM_HIENGLISH

0.001英寸

Y向上,X向右

MM_HIMETRIC

0.01毫米

Y向上,X向右

MM_LOENGLISH

0.01英寸

Y向上,X向右

MM_LOMETRIC

0.1毫米

Y向上,X向右

MM_TEXT(默认)

一个像素

Y向下,X向右

MM_TWIPS

1/1440英寸

Y向上,X向右

 

u      映射模式的设置

相关的函数为SetMapModeGetMapMode。调用设置映射模式函数SetMapMode可设置设备环境的映射模式,其形式为:

       SetMapMode(hdc,nMapMode)        //nMapMode为映射模式,见表2

调用GetMapMode函数可获取当前设备环境的映射模式,其形式为:

    nMapMode=GetMapMode(hdc);

窗口区域的定义由SetWindowExtEx函数完成,其函数原型为:

    BOOLSetWindowExtEx

    (

              HDC hdc,

              int nHeight,      //nHeight为逻辑单位表示的新窗口区域高度

              int nWidth       //nWidth为以逻辑单位表示的新窗口区域宽度

              LPSIZE lpSize   //lpSize为保存函数调用前窗口区域尺寸的SIZE结构地址,

                       //如果取NULL,则表示忽略调用前的尺寸

)

视口区域的定义由SetViewportExtEx函数完成,其函数原型为:

    BOOL SetViewportExtEx

(

       HDC hdc,

       int nHeight,     //nHeight为以物理设备单位表示的新视口区域高度

       int nWidth,     //nWidth为以物理设备单位表示的新视口区域高度

       LPSIZE lpSize  //lpSize为保存函数调用前视口区域尺寸的SIZE结构地址,

                        //如果取NULL,则表示忽略调用前的尺寸

)

视口的默认原点和窗口的默认原点均为(00)。可通过调用函数SetWindowOrgExSetViewportOrgEx设定窗口与视口的原点

BOOL SetWindowOrgEx

(

       HDC hdc,

       int X,           //XY为以逻辑单位表示的新窗口原点坐标

       int Y,

       LPPOINT lpPoint //lpPoint为保存函数调用前原点坐标的POINT结构的地址

                   //NULL,则忽略调用前的尺寸

)

 

       BOOL SetViewportOrgEx

       (

              HDChdc,        

              intX,             // XY为以逻辑单位表示的新视口原点坐标

              intY,

       LPPOINT lpPoint   //lpPoint为保存函数调用前原点坐标的POINT结构的地址

                                           //NULL,则忽略调用前的尺寸

       )

注:SetWindowOrgEx函数和SetViewportOrgEx函数只有在映射模式为MM_ANISOTROPICMM_ISOTROPIC时才有意义。

 

2  绘图工具与颜色

2.1  画笔

    画笔的操作包括:创建画笔、将画笔选入设备环境和删除画笔

u      画笔的创建

定义画笔句柄,形式如下:

              HPENhPen;

1     定义画笔句柄后,可直接调用函数GetStockObject获取Windows系统定义的4种画笔。

              WHITE_PEN

              BLACK_PEN

              DC_PEN

              NULL_PEN

       例如:获取画笔BLACK_PEN的形式如下:

              hPen=(HPEN)GetStockObject(BLACK_PEN);

2          定义新画笔。创建新画笔的形式如下:

hPen=CreatePen

       (

              int nPenStyle          // 确定画笔样式,可选样式说明见表3

              int nWidth,            // 画笔宽度,取0表示一个像素宽

              COLORREF rgbColor   // 画笔颜色

       )

3  画笔样式及说明

样式

说明

样式

说明

PS_DASH

虚线

PS_INSIDEFRAME

实线(边框线)

PS_DASHDOT

点划线

PS_NULL

PS_DASHDOTDOT

双点划线

PS_SOLID

实线

PS_DOT

点线

 

 

 

 

u      将画笔选入设备环境

创建画笔后,必须使用SelectObject函数将其选入设备环境。形式如下:

       hPenOld = SelectObject(hdc,hPen);  //hPen为所创建或获取的画笔句柄

u      删除画笔

不再使用当前画笔时,需调用函数DelectObject删除画笔,以免占用内存空间。在删除前应该首先调用函数SelectObject恢复原来系统的画笔,其形式如下:

       SelectObject(hdc,hPenOld);

       DelectObject(hPen);

 

2.2  画刷

u      画刷的创建

定义画刷句柄。形式如下:

       HBRUSH hBrush;

1          直接调用GetStockObject函数获取Windows系统提供的8种画刷(表4),调用画刷的形式如下:

hBrush =(HBRUSH)GetStockObject(nBrushStyle);//nBrushStyle为画刷样式

4  画刷样式及说明

样式

说明

样式

说明

BLACK_BRUSH

黑色画刷

LTGRAY_BRUSH

浅灰色画刷

DKGRAY_BRUSH

深灰色画刷

NULL_BRUSH

空画刷

GRAY_BRUSH

灰色画刷

WHITE_BRUSH

白色画刷

HOLLOW_BRUSH

虚画刷

DC_BRUSH

纯色画刷,可通过函数SetDCBrushColor设定

2          定义新画刷,创建函数为CreateSolidBrushCreateHatchBrush

函数CreateSolidBrush可创建一个具有指定颜色的单色画刷。调用形式如下:

       hBrush = CreateSolidBrush(rgbColor);  //rgbColor为画刷颜色

函数CreateHatchBrush可创建具有指定阴影图案和颜色的画刷。其调用形式如下:

       hBrush = CreateHatchBrush

              (

                     int nHatchStyle,        //nHatchStyle可阴影模式标识,见表5

                     COLORREF rgbColor   //画刷颜色

)

5  画刷的阴影模式

样式

说明

样式

说明

HS_BDIAGONAL

45度从左上角到右下角的阴影线

HS_CROSS

垂直相交的阴影线

HS_DIAGCROSS

45度叉线

HS_HORIZONTAL

水平阴影线

HS_FDIAGONAL

45度从左下角到右上角的阴影线

HS_VERTICAL

垂直阴影线

 

u      选入设备环境

创建画刷后,须调用SelectObject函数将其选入设备环境中。其形式如下:

       hBrushOld = SelectObject(hdc,hBrush);

u      删除画刷

同画笔

       SelectObject(hdc,hBrushOld);

       DeleteObject(hBrush);

 

2.3  颜色

              RGB(nRed,nGreen,nBlue)

 

3  常用绘图函数

3.1  设置画笔当前位置的函数MoveToEx

       BOOLMoveToEx

              (

                     HDChdc,

                     intX,            // X,Y分别为新位置的逻辑坐标

                     intY,

                     LPPOINTlpPoint  // lpPoint为存放原画笔位置的POINT结构地址

)

 

3.2  从当前位置向指定坐标点画直线的函数LineToEx

       BOOLLineToEx(HDC hdc,int X,int Y);

 

3.3  从当前位置开始,依次用线段连接lpPoints中指定各点的函数PolyLine

       BOOLPolyLine

              (

                     HDChdc,

                     LPPOINTlpPoints, // lpPoints为指向包含各点坐标的POINT结构数组的指针

                     intnCount        // nCountPOINT数组中点的个数

)

3.4  绘制椭圆弧线的函数Arc

       BOOL  Arc

              (

                     HDChdc,

                     intX1,int Y1,   //指定边框矩形左上角的逻辑坐标

                     intX2,int Y2,   //指定边框矩形右下角的逻辑坐标

                     intX3,int Y3,   //椭圆弧起始径线的确定点坐标

                     intX4,int Y4   //椭圆弧终止径线的确定点坐标

)

 

3.5  使用当前画笔绘制一个饼图,并使用当前画刷进行填充的函数Pie

       BOOL  Pie

              (

                     HDChdc

                     intX1,int Y1,   //指定边框矩形左上角的逻辑坐标

                     intX2,int Y2,   //指定边框矩形右下角的逻辑坐标

                     intX3,int Y3,   //椭圆弧起始径线的确定点坐标

                     intX4,int Y4   //椭圆弧终止径线的确定点坐标

)

 

3.6  使用当前画笔绘制一个矩形,并使用当前画刷进行填充的函数Rectangle

       BOOL  Rectangle

              (

                     HDChdc,

                     intX1,int Y1,   //(X1,Y1)为矩形的左上角的逻辑坐标

                     intX2,int Y2   //(X2,Y2)为矩形的右下角的逻辑坐标

)

 

3.7  使用当前画笔绘制一个圆角矩形,并使用当前画刷进行填充的函数RoundRect

       BOOL  RoundRect

              (

                     HDChdc,

                     intX1,int Y1,   //(X1,Y1)为矩形的左上角的逻辑坐标

                     intX2,int Y2,   //(X2,Y2)为矩形的右下角的逻辑坐标

                     intnWidth,        //nWidth为圆角的宽度

                     intnHeight     //nHeight为圆角的高度

)

 

3.8  使用当前画笔绘制一个椭圆,并使用当前画刷填充的函数Ellipse

       BOOL  Ellipose

              (

                     HDChdc

                     intX1,int Y1,   //(X1,Y1)为边界矩形的左上角的逻辑坐标

                     intX2,int Y2,   //(X2,Y2)为边界矩形的右下角的逻辑坐标

)

 

3.9  使用当前画刷绘制一个多边形,并使用当前画刷填充的函数Polygon

       BOOL  Polygon

              (

                     HDChdc,

                     LPPOINTlpPoints,  //lpPoints为包含各点坐标的POINT数组的地址

                     intnCount         //nCount为多边形点的个数

)

 

4  设置文本的设备环境

4.1  字体句柄

6  Windows系统提供的基本字体

字体

说明

字体

说明

ANSI_FIXED

ANSI标准的固定宽度的字体

ANSI_VAR

ANSI标准的可变宽度的字体

DEFAULT_GUI

当前GUI的默认字体

DEVICE_DEFAULT

当前图形设备的字体

OEN_FIXED

标准原设备制造商(OEM)提供的字体

SYSTEM_FIXED

Windows的标准固定宽度的字体

SYSTEM

Windows提供的可变宽度的字体,它常作为默认字体

 

 

常用的默认字体为SYSTEMWindows使用该字体作为系统界面字体,选择系统字体一般需要执行如下步骤:

1        定义字体句柄变量:HFONT hFont;

2        调用函数GetStockObject获取系统字体句柄,它返回的是系统的默认字体,语法如下:hFont = GetStockObject();

3        调用函数SelectObject将字体选入设备环境,语法如下:SelectObject(hdc,hFont);

 

4.2  创建自定义字体

       调用函数CreateFont创建自定义字体

       HFont= CreateFont

              (

                     intnHeight,      //字体高度,取0则采用系统默认值,使用逻辑单位

                     intnWidth,      //字体宽度,取0则采用系统默认值,使用逻辑单位

                     intnEscapement,  //每行文字相对于页底的角度,以十分之一度为单位

                     intnOrientation,  //每个文字相对于页底的角度,以十分之一度为单位

                     intnWeight,     //字体粗细度,取值范围为0~1000400位正常字体,700为黑体)

                     DWORDfdwltalic,  //如果要求字体倾斜,则取非零

                     DWORDfdwUnderLine,   //如果要求下划线,则取非零

                     DWORDfdwStrikeOout,   //如果要求中划线,则取非零

                     DWORDfdwCharSet,     //字体所属字符集

                     DWORDfdwOutputPrecision,  //输出精度,一般取默认值OUT_DEFAULT_PRECIS

                     DWORDfdwClipPrecision,    //剪裁精度,一般取默认值 CLIP_DEFAULT_PRECIS

                     DWORDfdwQuality,   //输出质量,一般取默认值DEFAULT_Quality

                     DWORDfdwPitchAndFamily,   //字体的间距及字体的系列,一般取默认值DEFAULT_PITCH

                     DWORDlpszFacename,    //字体名

)

 

4.3  设置字体和背景颜色

       函数SetTextColor设置字体颜色。其形式为:

              SetTextColor(hdc,crColor)    //crColor为设置的颜色

       函数SetBkColor设置背景颜色。其形式为:

              SetBkColor(hdc,crColor)

 

5  文本的输出过程

5.1  获取字体信息

       Windows程序中通过调用函数GetTextMetrics获取当前使用字体信息。调用该函数时,系统将当前字体的信息复制到tm标识的TEXTMETRIC结构中。其形式如下:

              GetTextMetrics(hdc,&tm);    //tmTEXTMETRIC结构

Typedef struct tagTEXTMETRIC

{                   //tm

       LONGtmHeight,  //字符高度

       LONGtmAscent,  //字符基线以上高度

       LONGtmDescent,  //字符基线以下高度

       LONGtmInternalLeading,  //tmHeight制订的字符高度顶部的控件

       LONGtmExternalLeading,  //行与行之间的间隔

       LONGtmAveCharWidth,  //平均字符宽度

       LONGtmMaxCharWidth,  //最大字符宽度

       LONGtmWeight,  //字符的粗细度

       LONGtmOverhang,  //合成字体间附加的宽度

       LONGtmDigitizedAspectX,  //为输出设备设计的X轴尺寸

       LONGtmDigitizedAspectY,  //为输出设备设计的Y轴尺寸

       BCHARtmFirstChar,  //字体中第一个字符值

       BCHARtmLastChar,  //字体中最后一个字符值

       BCHARtmDefaultChar,  //代替不在字体中字符的字符

       BCHARtmBreakChar,  //作为分割符的字符

       BYTEtmItalic,  //0则表示字体为斜体

       BYTEtmUnderLined,  //0则表示字体有下划线

       BYTEtmStruckOut;  //0表示字符为删除字体

       BYTEtmPitchAndFamily,  //字体间距和字体族

       BYTEtmCharSet;  //字符集

}TEXTMETRIC

 

5.2  格式化文本

       针对情况如下:

1        在文本行中确定后续文本的坐标。

2        在换行时确定下一行文本的坐标。

(一) 确定后续文本坐标

应先获取当前的字符串的宽度,Windows系统提供函数GetTextExtentPoint32来处理,并把它存储于一个SIZE结构中。

       BOOLGetTextExtentPoint32

              (

                     HDChdc,

                     LPCTSTRlpszString,   //lpszString为指定的字符串

                     intnLength,           //nLength为字符串中的字符数

                     LPSIZElpSize         //lpSize为返回字符串宽度及高度的SIZE数据结构地址

)

       SIZE数据结构定义如下:

              typedefstruct tagSIZE

              {

                     LONGcx;

                     LONGcy;

}SIZE;

 

(二) 确定换行时文本坐标

cy = tm.tmHeight+ tm.tmExternalLeading;

 

5.3  文本输出

       文本输出函数TextOut,其函数原型如下:

              BOOLTextOut

                     (

                            HDChdc,

                            intX,int Y,     //(X,Y)为用户区中字符串的起始坐标

                            LPCTSTRlpString,  //lpString为显示的字符串

                            intnCount         //nCount为字符串中字节数

)

 

原创粉丝点击