1、Visual c+2010第三讲简单图形绘制,主讲 朱世华,一 画线,1.1 基本知识 MoveTo( ) 开始画线、弧和多边形时,把光标移动到一个初始位置 LineTo( ) 画一条从初始位置到另一个点的直线 Arc( ) 画一段弧 ArcTo( ) 画一段弧,并更新初始位置 AngleArc( ) 画一条线,然后画一段弧,并更新初始位置 PolyDraw( ) 画一系列线段和Bezier样条 PolyLine( ) 画一系列线段 PolyPolyLine( ) 画多个系列线条画线属性是通过画笔的属性来控制,1.2 实例 CPen *oldpen,pen1,pen2,pen3;pen1.Cr
2、eatePen(PS_SOLID,2,RGB(255,0,0);/画笔1LOGPEN logpen;logpen.lopnStyle = PS_DASH;logpen.lopnWidth.x = 1;logpen.lopnWidth.y = 1;logpen.lopnColor = RGB(199,199,199);pen2.CreatePenIndirect(/画笔3,oldpen = (CPen *)pDC-SelectObject(,效果图,二.绘制形状,FillRect( ) 填充一个矩形 FillSolidRect( ) 用用一单色填充一个矩形 InvertRect( ) 反转一个矩
3、形的颜色 ExtFloodFill( ) 用用当前画刷填充一个区域,提供比FloodFill( )成员函数更多的灵活性 FrameRect( ) 画一个矩形的边框 填充属性是使用的是画笔, B r u s h对象控制怎样填充形状。设备环境用一个H B R U S H句柄指向一个画刷对象。若用M F C创建一个B r u s h对象,首先要创建一个C B r u s h类对象. GetBrushOrg获取当前画刷的起点 SetBrushOrg指定选入设备上下文的下一个画刷的起点 FillRgn( ) 填充一个区域 InvertRgn( ) 反转一个区域的颜色 FrameRgn( ) 画一个特定区
4、域的边框,实例二,CBrush *oldbrush,brush1,brush2,brush3;brush1.CreateSolidBrush(RGB(100,100,100);brush2.CreateHatchBrush(HS_CROSS,RGB(200,200,200);LOGBRUSH logbrush;logbrush.lbStyle = BS_HOLLOW;/logbrush.lbColor = ;/logbrush.lbHash = ;brush3.CreateBrushIndirect(,实例二(续),oldbrush = (CBrush*)pDC-SelectObject(,绘
5、制文本之一,TextOut( ) 在在一个指定的位置,输出一个字符串 ExtTextOut( ) 在在一个矩形区域里输出一个字符串 TabbedTextOut( ) 在基于用该函数传输的一个表,在指定位置输出一个字符串,并将字符串中的任何制表符转换为空格 DrawText( ) 在在指定的矩形域里绘制文本,但比TextOut( )有更多的选项,如把文本居中和显示多行文本文本属性控制怎样绘制文本。有三种类型的文本属性:颜色、对齐方式和字体 文本颜色的颜色可以使用函数 SetTextColor( ) 设定前景色(即文本色) SetBkColor( ) 设置输出文本处的背景色。,绘制文本之二,文本的
6、对其方式; 对齐方式属性决定文本怎样排列(如:左对齐、右对齐、中央对齐)。确切地说, TextOut( )函数中的x、y变量可以表示文本的左边、右边或者底部。使用默认的对齐方式, x、y代表文本的左上角,但还有其他一些方式。要改变设备环境的文本对齐属性,可以用SetTextAlign( )函数和下面的标志值之一: TA _ LEFT 儿TextOut( )中的x变量表示文本的左边。TA _ L E F T是默认设置值 TA _ TOP 儿TextOut( )中的y变量表示文本的顶部。TA _ TO P是默认设置值 TA _ RIGHT 儿TextOut( )中的y变量表示文本的右边。计算文本的
7、边界矩形,用以决定从哪儿开始绘制文本 TA _ CENTER 儿TextOut( )中的y变量表示文本的中部 TA _ BASELINE 儿TextOut( ) 中的y变量表示文本的基线 TA _ BOTTOM 儿TextOut( )中的y变量指示文本的底部virtual int DrawText(LPCTSTR lpszString,ini nCount ,LPRECTlpRect,UINT nForm-at); int DrawText(const Cstring/ 如果成功,则返回文本高度。,绘制文本之三,lpszString指向要绘制的文本的指针。如果nCount是-1,该字符串必须是
8、空终止的。NCount字符串中字符数目。如果为-1,lpszString被认为是一个指向空终止的字符串的长指针。DrawText自动计算字符数目。LpRect指向RECT结构或Crect对象的指针,结构(或对象)中包含有矩形(逻辑单位表示),其中的文本带有格式。 NFormat指定格式化文本的方法。它可以是下列值的组合(可用运算符或位操作符进行组合):DT_BOTTOM 底部对齐的文本。该值必须同DT_SINGLELINE组合使用。 DT_CALCRECT 决定矩形的宽度和高度,如果是多行文字,DrawText将会使用lpRect指向的矩形,并扩展矩形以容纳文本。如果是单行文本,DrawTex
9、t将会调整矩形的右边以便容纳该行文字。两种情况下,DrawText都返回格式化文本的高度,但并不绘制它们。,绘制文本之三,DT_CENTER 将文本水平居中。DT_END_ELLIPSIS或DT_PATH _ELLIPSIS 如果必要,将用椭圆替代部分指定的文本,以便适合给定的矩形。除非指定DT_MODIFYSTRING 标志,否则给定的字符串不会被修改。可以指定DT_END_ELLIPSIS在字符串末端替代字符,或者指定DT_PATH_ELLIPSIS在字符串中间替代字符。如果字符串中含有反斜杠(),DT_PATH_ELLIPSIS将尽可能保存在最后一个反斜杠后的文本。DT_EXPANDTA
10、BS 扩展制表符,每一制表符所含字符的缺省数目是8。 DT_EXTERNALLEADING包括在行高中的字体外部间隔。通常外部间隔不包括在一行文本的高度之中。DT_LEFT 文本左对齐。,绘制文本之四,lDT_MODIFYSTRING 修正给定字符串以便与显示文本匹配。只有在指定DT_END_ELLIPSIS 或DT_ PATH_ELLIPSIS 标志时,该标志才起作用。 DT_NOCLIP 绘制但不剪切, DrawText 在使用DT_NOCLIP后总能运行得快一些。DT_NOPREFIX 关闭前缀字符,通常DrawText 将助记前缀&理解为其后字符加上下划线,&前缀符表示显示一个&字符,
11、指定 DT_NOPREFIX后,也关闭了这种处理。l DT_PATH_ELLIPSISl DT_RIGHT 文本右对齐。 DT_SINGLELING 指定单行,回车与换行不会中断该行。 DT_TABSTOP 设置制表位,nFormat的高位字节即为每一制表符所含字符的数目,缺省值为8。,绘制文本之五,DT_TOP 文本靠上对齐(只用于单行文字)。 DT_VCENTER 垂直居中对齐(只用于单行文字)。DT_WORDBREAK 设定单词中断。如果超过lpRect指定的矩形边界,行会自动在词间断开,回车与换行也会断行。 注意 DT_CALCRECT,DT_EXTERNALLEADING,DT_IN
12、TERNAL,DT_NOCLIP和DT_NOPREFIX不能与DT_TABSTOP一同使用。,实例三,CString str =_T( “11111111111111111111111“); CRect rect; rect.top = 200; rect.left = 200; rect.bottom = 250; rect.right = 250; pDC-DrawText(str,&rect,DT_LEFT|DT_END_ELLIPSIS)/多出的字符用显示,实例四,CRect Rect;GetWindowRect(,实例四续,Rect.right=Rect.Width();Rect.b
13、ottom=Rect.Height();Rect.left=Rect.top=0;pDC-FillSolidRect(Rect,:GetSysColor(COLOR_3DFACE);pDC-DrawText(StrInfo,Rect+CPoint(0,1),DT_SINGLELINE|DT_LEFT);pDC-SetTextColor(:GetSysColor(COLOR_3DSHADOW);pDC-DrawText(StrInfo,Rect,DT_SINGLELINE|DT_LEFT);pDC-SetTextColor(OldColor);pDC-SelectObject(pOldFont)
14、;,实例五,CFont MyFont; /声明逻辑字体变量MyFontCFont* pOldFont;CRect rect; /定义矩形变量rect,保存客户区域CString caption=_T(“TextOut()函数输出的透明库存字体OEM_FIXED_FONT!“);pDC-SelectStockObject(OEM_FIXED_FONT); /选择库存字体GetClientRect(rect);/取得客户区的区域保存到rect中,pDC-SetTextAlign(TA_BASELINE);/设置文本的对齐方式为“将点与所选字体的基线对齐“pDC-SetBkMode(TRANSPAR
15、ENT);/设置背景模式不透明pDC-SetTextColor(RGB(255,0,0);/设置文本颜色为红色pDC-SetBkColor(RGB(0,0,255);/设置文本背景颜色为蓝色pDC-TextOut(rect.right/6,rect.bottom/6,caption);/输出文本,MyFont.CreatePointFont(140, _T(“Arial“);/由CreatePointFont函数直接创建一种逻辑字体pOldFont = pDC-SelectObject(,CString caption1=_T(“用CreatePointFont创建、ExtTextOut输出的
16、不透明的Arial字!“);pDC-ExtTextOutW(currentX,currentY,ETO_OPAQUE, CRect(currentX,currentY-30,currentX+300,currentY+30), caption1,caption1.GetAllocLength(),NULL);/在指定的矩形内不透明显示文本pDC-SelectObject(pOldFont);/恢复系统先前的字体,绘制位图和图标,DrawIcon 在在指定的位置画一个图标 BitBlt 在 从指定的设备环境中拷贝一个位图,通常是从磁盘中装入或在内存中创建,如前面所述 StretchBlt 在 与
17、BitBlt( )基本相同,但它试图伸展或压缩一个位图以适应目标 PlgBlt 从源设备上下文的指定矩形到给定设备上下文中指定平行多边形,执行颜色数据位的位块传递 FloodFill 用当前画刷填充区域 ExtFloodFill 用当前画刷填充区域。比FloodFill成员函数提供更多灵活性MaskBlt使用给定屏蔽和光栅操作对源和目标位图合并颜色数据,绘制位图和图标,PatBlt 创建位特征 MaskBlt 使用给定屏蔽和光栅操作对源和目标位图合并颜色数据 实例1: HICON hicon = AfxGetApp()-LoadStandardIcon(MAKEINTRESOURCE(IDI_
18、QUESTION); pDC-DrawIcon(0,0,hicon); BOOL BitBlt(int x,int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, intySrc, DWORD dwRop); x指定目标矩形左上角的逻辑X坐标。Y指定目标矩形左上角的逻辑Y坐标。NWidth指定目标矩形和源位图的宽度(逻辑单位)。NHeight指定目标矩形和源位图的高度(逻辑单位)。PSrcDC指向CDC对象的指针,标识待拷贝位图的设备上下文。如果dwRop指定不包括源的光栅操作,则它必须为NULL。XSrc指定源位图左上角的逻辑X坐标。YS
19、rc指定源位图左上角的逻辑Y坐标。,绘制位图和图标,DwRop指定要执行的光栅操作。光栅操作代码定义GDC如何合并输出操作中的颜色,包括当前画刷、可能的源位图和目标位图。下面对dwRop列出光栅操作代码及其描述:BLACKNESS 所有输出变黑。DSTINVERT 反转目标位图。MERGECOPY 使用布尔AND操作符合并特征与源位图。MERGEPAINT 使用布尔OR操作符合并特征与源位图。NOTSRCCOPY 拷贝反转源位图到目标。,绘制位图和图标,NOTSRCERASE 反转使用布尔OR操作符合并源和目标位图的结果。PATCOPY 拷贝特征到目标位图。PATINVERT 使用布尔XOR操
20、作符合并目标位图和特征。PATPAINT 使用布尔OR操作符合并反转源位图和特征。用布尔OR操作符合并这项操作结果与目标位图。SRCAND 使用布尔AND操作符合并目标像素和源位图。SRCCOPY 拷贝源位图到目标位图。SRCERASE 反转目标位图并用布尔AND操作符合并这个结果和源位图。,绘制位图和图标,SRCINVERT 使用布尔XOR操作符合并目标像素和源位图。SRCPAINT 使用布尔OR操作符合并目标像素和源位图。 WHITENESS 所有输出变白。 CDC *memDC = new CDC; memDC-CreateCompatibleDC(pDC); CBitmap bitma
21、p; bitmap.CreateCompatibleBitmap(pDC,20,20); memDC-SelectObject( lpPoint逻辑空间中包含三个点的数组的指针。它指定了一个目标平行四边形的三个顶点。源矩形的左上角与数组中的第一个点映射,右上角与第二个点映射,第三个点指向左下角。源矩形的右下角与平行四边形未能明确表示的第四点映射。,绘制位图和图标,pSrcDC源设备上下文的标识。xSrc用逻辑单位表示的源矩形左上角的X坐标。 ySrc用逻辑单位表示的源矩形左上角的Y坐标。nWidth用逻辑单位表示的源矩形的宽度。nHeight用逻辑单位表示的源矩形的高度。maskBitmap标
22、识用以屏蔽源矩形颜色的可选的黑白位图。xMask黑白位图左上角的X坐标。yMask黑白位图左上角的Y坐标。,绘制位图和图标,对源设备上下文指定的矩形到给定设备上下文中平行四边形的颜色数据实行位块(bit-block)转换。如果位掩码的句柄代表一个有效的位图,函数利用该函数对源矩形的颜色数据位进行屏蔽。平行四边形的第四个顶点(D)是将前三个点(A,B,C)定义为矢量后,经D=B+C-A计算得到。如果存在位掩码1,表示源像素色将会拷贝给目标位图,为0表示目标位图的像素不会被改变。如果掩码矩形小于源矩形和目标矩形,函数将复制掩码模式。 在源设备上下文中允许度量形式转换和解释。但不允许选择和剪切转换,
23、掩码位图不是黑白位图,出错。目标设备上下文的扩展模式决定了像素如何被扩展或压缩。如果源设备上下文标识了增强元文件设备上下文,记录增强元文件时,则出错。BOOL StretchBlt(int x ,int y ,int nWidth,int nHeight,CDC*pSrcDC,intxSrc,int ySrc, int nSrcWidth,int nSrcHeight.DWORD dwRop),绘制位图和图标,将源矩形中的位图拷贝到目标矩形中,如果有必要,可以扩展或压缩该位图使其与目标矩形尺寸吻合。 如果nSrcWidth和nWidth或nSrcHeight和nHeight的符号不同,Stre
24、tchBlt将为位图创建一个镜像。如果nSrcWidth和nWidth符号不同,函数沿X轴创建镜像。如果nSrcHeight和nHeight符号不同,函数沿Y轴创建镜像。,绘制位图和图标,BOOL MaskBlt(int x ,int y,int nWidth ,int nHeight,CDC* pSrcDC,int xSrc,intySrc,CBitmap maskBitmap在源设备上下文中黑白掩码位图与彩色位图的标识。xMaskmaskBitmap设定的掩码位图的水平像素偏移量。yMaskmaskBitmap设定的掩码位图的水平像素偏移量。 使用给定的掩码和光栅操作组合源位图和目标位图中的彩色数据。maskBitmap设置的掩码值为1,表明dwRop指定的前景光栅操作代码应在该位置上得以应用。maskBitmap设置的掩码值为0,表明dwRop指定的背景光栅操作代码应在该位置上得以应用。如果光栅操作需要源对象,掩码矩形必须覆盖源矩形,否则会导致失败。如果光栅操作不需要源对象,掩码矩形必须覆盖目标矩形,否则会导致失败。,