vs2010/mfc编程入门之四十九(图形图像:cdc类及其屏幕绘图函数)
&&&&&& 上一节中鸡啄米讲了文本输出的知识,本节的主要内容是cdc类及其屏幕绘图函数。
&&&&&& cdc类简介
&&&&& &cdc类是一个设备上下文类。
&&&&&& cdc类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户区关联的显示上下文的成员函数。使用cdc的成员函数可以进行所有的绘图操作,包括处理绘图工具、gdi对象的选择、颜色和调色板的处理、获取和设置绘图属性、映射、窗口范围、坐标转换、剪切以及绘制直线、简单图形、椭圆和多边形等,另外它还为文本输出、处理字体、使用打印机跳转和滚动等提供了成员函数。
&&&&&& 如上所述,cdc类几乎封装了所有的windows gdi函数,另外,mfc中还有几个由cdc类派生的子类,包括cwindowdc、cpaintdc、cclientdc、cmetafiledc,它们用来进行一些特定的绘图操作。
&&&&&& 一般我们在使用完cdc对象后要记得删除它,否则会有内存泄露。很多情况下我们可以调用cwnd::getdc()函数来获取设备上下文指针,即cdc指针,这个时候记得用完后调用cwnd::releasedc()函数释放设备上下文。
&&&&&& cdc类的屏幕绘图成员函数
&&&&&& cdc类有很多成员函数,鸡啄米在这里只大概讲下比较常用的绘图函数,包括绘制点、直线、矩形、椭圆、多边形、文本以及位图等的成员函数。
&&&&&&&colorref setpixel(int x,int y,colorref crcolor);
&&&&&& colorref setpixel(point point,colorref crcolor);
&&&&&& 上面两个成员函数用来将指定坐标点的像素设置为指定的颜色,这样就实现了画点功能。参数x为点的逻辑x坐标;参数y为点的逻辑y坐标;参数crcolor为要为点设置的颜色;参数point指定点的逻辑x坐标和逻辑y坐标,可以为其传入point结构体变量或者cpoint对象。
&&&&&& cpoint moveto(int x,int y);
&&&&&& cpoint moveto(point point);
&&&&&& 将当前点移动到指定位置。参数x指定新位置的逻辑x坐标;参数y指定新位置的逻辑y坐标;参数point指定新位置的逻辑x坐标和逻辑y坐标,可以为其传入point结构体变量或者cpoint对象。
&&&&&& bool lineto(int x,int y);
&&&&&& bool lineto(point point);
&&&&&& 绘制一条从当前点到指定点(不包括指定点)的直线。参数x为指定点的逻辑x坐标;参数y为指定点的逻辑y坐标;参数point为指定点的逻辑x坐标和逻辑y坐标。一般我们绘制直线时就可以先调用moveto函数移动当前点到某个位置,然后调用lineto画直线。
&&&&&& bool rectangle(int x1,int y1,int x2,int y2);
&&&&&& bool rectangle(lpcrect lprect);
&&&&&& 使用当前画笔绘制矩形。参数x1指定矩形左上角的x坐标;参数y1指定矩形左上角的y坐标;参数x2指定矩形右下角的x坐标;参数y2指定矩形右下角的y坐标;以上坐标均为逻辑单位。参数lprect为矩形对象的指针,可以为其传入crect对象或rect结构体变量的指针。
&&&&&& bool ellipse(int x1,int y1,int x2,int y2);
&&&&&& bool ellipse(lpcrect lprect);
&&&&&& 绘制椭圆。参数x1指定椭圆的包围矩形左上角的x坐标;参数y1指定椭圆的包围矩形左上角的y坐标;参数x2指定椭圆的包围矩形右下角的x坐标;参数y2指定椭圆的包围矩形右下角的y坐标;以上坐标均为逻辑单位。参数lprect指定椭圆的包围矩形,可以传入crect对象或rect结构体变量的指针。
&&&&&& bool polyline(lppoint lppoints,int ncount);
&&&&&& 由指定的多边形顶点绘制多边形。参数lppoints为指向一个point结构体变量数组或cpoint对象数组的指针,其中的point结构体变量或cpoint对象代表了多边形顶点的坐标;参数ncount为数组中点的个数,至少为2。
&&&&&& virtual bool textout(int x,int y,lpctstr lpszstring,int ncount);
&&&&&& bool textout(int x,int y,const cstring& str);
&&&&&& 使用当前选择的字体在指定位置输出文本。 参数x指定文本起始点的x坐标;参数y指定文本起始点的y坐标;参数lpszstring为要输出的文本字符串;参数ncount指定字符串中的字节个数;参数str为包含要输出的字符的cstring对象。这两个函数在上一节中其实已经讲到了。
&&&&&& bool bitblt(
&&&&&&&&&&&&& int x,
&&&&&&&&&&&&&&int y,
&&&&&&&&&&&&&&int nwidth,
&&&&&&&&&&&&& int nheight,
&&&&&&&&&&&&& cdc* psrcdc,
&&&&&&&&&&&& &int xsrc,
&&&&&&&&&& && int ysrc,
&&&&&&&&&&& & dword dwrop
&&&&&& );
&&&&&& 从源设备上下文拷贝一幅位图到当前设备上下文。参数x指定目标矩形区域左上角的逻辑x坐标;参数y指定目标矩形区域左上角的逻辑y坐标;参数nwidth指定目标矩形区域和源位图的宽度(逻辑单位);参数nheight指定目标矩形区域和源位图的高度(逻辑单位);参数psrcdc为指向源设备上下文的cdc对象的指针,如果dwrop指定了一个不包含源的光栅操作,那么psrcdc可以为null;参数xsrc指定源位图左上角的逻辑x坐标;参数ysrc指定源位图左上角的逻辑y坐标;参数dwrop指定要执行的光栅操作,光栅操作码定义了gdi如何将当前画刷颜色、源位图颜色和目标位图颜色组合形成新的颜色,下面是一些常用的光栅操作码及含义:
&&&&&& blackness:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。
&&&&&& dstinvert:表示使目标矩形区域颜色取反。&
&&&&&& mergecopy:表示使用布尔型的and(与)操作符将源矩形区域的颜色与特定模式组合一起。
&&&&&& mergepaint:通过使用布尔型的or(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。
&&&&&& notsrccopy:将源矩形区域颜色取反,于拷贝到目标矩形区域。
&&&&&& notsrcerase:使用布尔类型的or(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。
&&&&&& patcopy:将特定的模式拷贝到目标位图上。&
&&&&&& patpaint:通过使用布尔or(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用or(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
&&&&&& patinvert:通过使用xor(异或)操作符将源和目标矩形区域内的颜色合并。&
&&&&&& srcand:通过使用and(与)操作符来将源和目标矩形区域内的颜色合并。
&&&&&& srccopy:将源矩形区域直接拷贝到目标矩形区域。
&&&&&& srcerase:通过使用and(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。&
&&&&&& srcinvert:通过使用布尔型的xor(异或)操作符将源和目标矩形区域的颜色合并。
&&&&&& srcpaint:通过使用布尔型的or(或)操作符将源和目标矩形区域的颜色合并。
&&&&&& whiteness:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。
&&&&&& 好了,本节就讲到这里了,主要就是大概讲了讲cdc类,又介绍了cdc类一些常用的绘图函数。如果想了解更多的资料可以查阅msdn。谢谢关注鸡啄米的vs2010/mfc教程。