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 获取设备环境
获取设备环境是应用程序输出图形的先决条件,常用的三种获取设备环境的方法是调用函数BeginPaint、GetDC和GetDCEx。
u 调用BeginPaint函数
应用程序相应WM_PAINT消息进行图形刷新时,主要通过调用BeginPaint函数获取设备环境,其形式为:
PAINTSTRUCT ps;
hdc=BeginPaint(hwnd,&ps); //ps为PAINTSTRUCT类型结构。
由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 BeginPaint与GetDC的区别
函数
项目
BeginPaint函数
GetDC(GetDCEx)函数
使用环境
只用于图形刷性时获取设备环境
使用较为广泛
操作区域
使用BeginPaint函数获取设备环境后,操作区域为无效区域
使用GetDC函数获取设备环境后,操作区域为特定窗口的客户区或整个窗口
释放设备环境所用函数
由EndPaint函数释放
由ReleaseDC函数释放
1.3 映射模式
映射模式:不用考虑输出设备的坐标系统情况,而在一个统一的逻辑坐标系中组成图形的绘制与操作,映射模式定义了将逻辑单位转化为设备的量度单位以及设备的X方向和Y方向。
表2 Windows中的映射模式
映射模式
将一个逻辑单位映射为
坐标系设定
MM_ANISOTROPIC
由SetWindowExtEx或SetViewportExtEx函数确定
可选
MM_ISOTROPIC
由SetWindowExtEx或SetViewportExtEx函数确定
可选,但X轴和Y轴的单位比例为1:1
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 映射模式的设置
相关的函数为SetMapMode和GetMapMode。调用设置映射模式函数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,则表示忽略调用前的尺寸
)
视口的默认原点和窗口的默认原点均为(0,0)。可通过调用函数SetWindowOrgEx和SetViewportOrgEx设定窗口与视口的原点
BOOL SetWindowOrgEx
(
HDC hdc,
int X, //X和Y为以逻辑单位表示的新窗口原点坐标
int Y,
LPPOINT lpPoint //lpPoint为保存函数调用前原点坐标的POINT结构的地址
//取NULL,则忽略调用前的尺寸
)
BOOL SetViewportOrgEx
(
HDChdc,
intX, // X和Y为以逻辑单位表示的新视口原点坐标
intY,
LPPOINT lpPoint //lpPoint为保存函数调用前原点坐标的POINT结构的地址
//取NULL,则忽略调用前的尺寸
)
注:SetWindowOrgEx函数和SetViewportOrgEx函数只有在映射模式为MM_ANISOTROPIC和MM_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 定义新画刷,创建函数为CreateSolidBrush和CreateHatchBrush。
函数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 // nCount为POINT数组中点的个数
)
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提供的可变宽度的字体,它常作为默认字体
常用的默认字体为SYSTEM,Windows使用该字体作为系统界面字体,选择系统字体一般需要执行如下步骤:
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~1000(400位正常字体,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); //tm为TEXTMETRIC结构
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为字符串中字节数
)
- VC6.0图形处理技术和文字处理技术
- 图形图形处理技术
- PHP图像图形处理技术
- VC6.0图形处理5--几何变换
- VC6.0图形处理6--图像增强
- VC6.0图形处理7--边缘检测
- VC6.0图形处理9--轮廓提取
- VC6.0图形处理10--腐蚀膨胀
- 图形识别处理技术(C++)
- VC6.0中DAO与ADO技术
- vc6.0程序调试技术总结
- 【VC6.0】直线的橡皮筋绘图技术
- vc6.0程序调试技术总结
- VC6.0图形处理8--Hough变换(上)
- VC6.0图形处理8--Hough变换(下)
- 3D图形技术概念和渲染管线的处理
- 图形加速卡技术
- 矢量图形技术
- 写好函数的几个要点
- QT在S3CXX平台的移植。
- MVC
- osworkflow简单教程
- ASP.net 对XML文件的操作
- VC6.0图形处理技术和文字处理技术
- Linux系统服务
- 关于2个窗体间的传值问题
- 一个ASP.net购物车的代码程序.
- 利用osworkflow实现业务流程
- 数据库附加问题
- 设为首页_JS代码
- 红外碳硫分析仪选择指南
- 充分利用ASP.NET的三种缓存提高站点性能