Windows程序设计第三章图形编程3.1设备环境首先要明白一个常识,Windows是早于C++的,并独立于C++之外,因此,Windows的某些对象(注意这个说法“Windows的对象”)并不都属于C++封装技术的规范之内,即Windows的这些对象是Windows作为一个OS本身的对象,不是由某个C++的类创建而来,但是在C++里却可以用一个类封装这个(或这些)对象,并创建它们。设备环境就属于上述的对象之一,它是Windows的对象,MFC用CDC类封装了设备环境对象。3.1设备环境WindowsAPI给出了4种类型的设备环境•显示设备环境:支持视频显示器上的图形操作;•信息设备环境:提供设备数据的检索;•内存设备环境:支持位图上的图形操作;•打印设备环境:支持打印机或绘图仪上的图形操作。在MFC中,针对Widnows的这4类设备环境,分别用4个DC类进行了封装:•CDC类:基类;•CPaintDC:只用于屏幕绘图;•CClientDC:用于窗口客户区绘图;•CWindowDC:用于窗口绘图;•CMetaFileDC:用于操作图元文件3.1设备环境CObjectCDCCPaintDCCClientDCCWindowDCCMetaFileDC3.1设备环境屏幕设备环境--用于绘制窗口内容创建屏幕设备环境实例指针•CDC*pDC=GetDC();//绘制客户区•CDC*pDC=GetWindwoDC;//绘制非客户区•CDC*pDC=CDC::FromHandle(::GetDC(NULL));//绘制整个屏幕释放设备环境实例指针•ReleaseDC(pDC);下面简单说明屏幕设备环境的使用方法•信件MFC工程•找到OnDraw()函数•补充编写OnDraw()函数•编译程序•执行程序3.1设备环境3.1设备环境3.1设备环境单文档-记事本多文档-word,execl基本对话框-扫雷3.1设备环境3.1设备环境3.1设备环境3.1设备环境3.1设备环境3.1设备环境3.1设备环境3.1设备环境编译:主要进行语法检查,看你编的程序语法上有没有错误链接:将编译好的文件与库函数组装,生成可执行的exe文件设置断点:在光标所在行设置或取消断点调试:进入调试状态,程序会在第一个断点处停下等待。3.1设备环境StepInto-如果当前正在执行的语句中有函数,那么会进入函数体单步执行函数体的每一条语句。StepOver-如果当前正在执行的语句中有函数,会执行调用函数,不单步执行函数体。StepOut-如果当前正单步执行函数体,会直接跳出函数执行,返回上层代码。3.1设备环境变量监视窗口-程序中所有变量及其值均可以在其中查到自定义变量监视窗口-可以将上面窗口中某个变量拖动到本窗口中来监视3.1设备环境3.1设备环境内存设备环境内存设备环境通常是在文件处理的时候需要的,它为进行处理的文件开辟一片内存空间。典型的应用是进行位图操作时:CDCMemDC;//创建CDC类的一个实例MemDCCBitmapbitmap;//声明位图类CBitmap的一个实例对象bitmapMemDC.CreateCompatibleDC(pDC);//创建兼容DCbitmap.CreateCompatibleDC(pDC,ICON_WIDTH,ICON_HEIGHT);//创建位图类CBitmap的实例对象MemDC.SelectObject(&bitmap);//内存设备对象选中位图对象bitmap3.2绘图函数画点-CDC实例对象包含两个常用画点函数•SetPixel(x,y,RGB(r,g,b))-用指定的颜色画一个像素,返回绘制时使用的实际颜色.•SetPixelV(x,y,RGB(rg,b))-用指定的颜色画一个像素,没有返回值,因此绘图速度比上一个函数要快3.2绘图函数3.2绘图函数画线-CDC实例对象包含8个常用画线函数•MoveTo()-开始画线、弧和多边形时,把光标移动到一个初始位置;•LineTo()-画一条从初始位置到另一个点的直线;•Arc()-画一段弧;•AngleArc()-画一条线,然后画一段弧,并更新初始位置;•PolyDraw()-画一系列线段和Bezier(贝济埃)曲线;•PolyLine()-画一系列线段;•PolyPolyLine()-画多个系列线段;3.2绘图函数3.2绘图函数画形状•Ellipse()-画一个椭圆;•Rectangle()-画一个矩形;•Pie()-画一个扇形;•RoundRect()-画一个圆角矩形;•Draw3dRect()-画一个三维矩形;•Polygon()-画一个得到焦点的矩形;•DrawEdge()-画一个矩形的边缘;•PolyPolygon()-创建一个或多个多边形;3.2绘图函数定义弧的椭圆母体所对应的矩形区域定义切割椭圆母体的两个点3.2绘图函数高光部分的颜色阴影部分的颜色定义扇形、弓形的椭圆母体所对应的矩形区域定义切割椭圆母体的两个点注意:逆时针原则3.2绘图函数形状填充和翻转•FillRect()-填充一个矩形;•FillSolidRect()-用一单色填充一个矩形;•InvertRect()-反转一个矩形颜色;•FloodFill()-用当前画刷填充一个区域;•ExtFloodFill()-用当前画刷填充一个区域,提供比FloodFill()成员函数更多的灵活性;•FrameRect()-画一个矩形的边框3.2绘图函数绘制文本•TextOut()-在一个指定位置,输出一个字符串;•ExtTextOut()-在一个矩形区域内输出一个字符串;•DrawText()-在指定的矩形区域内绘制文本,比TextOut()有更多的选择,如文本居中和显示多行文本等;3.2绘图函数绘制位图和图标•位图-由大量像素组成的颜色阵列。•图标-位图的一种,通常为32×32像素,图标具有透明色这一附加能力。绘图函数介绍•DrawIcon()-在指定位置画一个图标;•BitBlt()-从指定的设备环境中复制一个位图,通常是从磁盘中装入或在内存中创建;•PatBlt()-创建一个位图模式;•LoadBitmap()-从应用程序资源里创建一个位图对象;•CreateBitmapIndirect()-由BITMAP结构提供信息,创建一个位图对象;•CreateBitmap()-创建位图结构信息;•CreateCompatibleBitmap()-用一个已有的设备环境指向的位图对象所提供的信息,创建一个位图;3.2绘图函数设备无关位图位图文件中包含了色彩数据及绘制数据等显示位图所需的所有信息,这样它就可以在各种不同显示设备上进行显示。设备相关位图不包含色彩数据,而是将要显示的色彩数据映射到某一设备的调色板上去。因此只有特定的设备能够显示该位图。位图的绘制:在屏幕或打印机上绘制一个位图,需要两个设备环境,一个包含位图属性,另一个用来复制位图。3.2绘图函数3.2绘图函数3.3绘图属性在绘图和对设备环境进行操作的时候,有很多地方需要用户提前指定,如线条个样式,笔刷的色彩,背景的颜色等等。这些都需要程序员编程时进行设定3.3绘图属性画线属性•CreatePen()-用指定的颜色、宽度和模式创建一个画笔对象,模式可以是从实线到虚线的任何一种,由用户指定线和空格的长度。•CreatePenIndirect()-用LPLPGPEN结构创建一个Pen对象,不必创建用户自己的Pen对象。•SelectStockObject()-取出系统默认绘图对象,系统预定义对象相应的标志值为:BLACK_PEN-包含黑画笔的属性;WHITE_PEN-包含白画笔的属性;NULL_PEN-使用绘图函数不能画线3.3绘图属性SelectObject()函数用于将新对象选中并加入设备环境中以便进行下一步的绘制。同时该函数返回设备环境中原有对象的指针,以方便用户在以后回复系统原有绘制属性。因此在实际实用过程中,通常采用:Old_k=SelectObject(New_k)的方式将系统原有的绘制对象指针保存下来。3.3绘图属性形状填充属性•CreateSolidBrush()-创建一个原色Brush对象。•CreateHatchBrush()-创建一个指定阴影模式和颜色的画刷。•CreateBrushdirect()-用LOGBRUSH结构中的设置值创建CBrush对象。•CreatePatternBrush()-创建一个用位图指定模式的Brush。•CreateDIBPatternBrush()-创建一个用设备无关位图指定模式的CBrush对象。•CreateSysColorBrush()-创建一个系统默认颜色的Brush对象。•SelectStockObject()-取出系统默认绘图对象BLACK_BRUSH-用黑色填充形状的属性WHITE_BRUSH-用白色填充形状的属性DKGRAY_BRUSH-用深灰色填充形状的属性GRAY_BRUSH-用灰色填充形状的属性LTGRAY_BRUSH-用浅灰色填充形状的属性NULL_BRUSH-使绘图函数不能对形状进行填充3.3绘图属性文本绘制属性•文本颜色:SetTextColor()-设定前景色(即文本颜色)。SetBKColor()-设置输出文本处的背景色。•文本对齐方式-SetTextAlign()TA_LEFT-左对齐方式TA_RIGHT-右对齐方式TA_CENTER-居中对齐方式TA_BASELINE-文本基线对齐方式TA_TOP-文本顶部对齐方式TA_BOTTOM-文本底部对齐方式3.3绘图属性文本绘制属性•文本字体CreateFont()-创建一个字体对象,指定字体特性CreatePointFont()-创建指定字样名和尺寸的字体CreateFontIndirect()-使用LOGFONT结构创建字体CreatePointFontIndirect()-创建LOGFONT结构所指定属性的字体SelectStockObject()-获取系统默认字体•SYSTEM_FONT-Windows窗口中绘制菜单、任务栏时用的默认字体•SYSTEM_FIXED_FONT-Windows在3.0版以前使用的默认字体•ANSI_FIXED_FONT-非成比例间隔的默认字体(每个字符在行中占用相同的空间)•ANSI_VAR_FONT-成比例间隔的默认字体(字母I在一行中占据的空间比W少)LOGFONT结构定义:typedefstructtagLOGFONT{LONGlfHeight;LONGlfWidth;LONGlfEscapement;LONGlfOrientation;LONGlfWeight;BYTElfItalic;BYTElfUnderline;BYTElfStriceOut;BYTElfCharSet;BYTElfOutPrecision;BYTElfClipPrecision;BYTElfQuality;BYTElfPitchAndFamily;TCHARlfFaceName[LF_FACESIZE];}LOGFONT,*PLOGFONT;3.3绘图属性映像模式-Windows在显示设备上进行绘制时的制式,通常默认为像素形式,也可是英寸、毫米等SetMapMode()-设施绘图映像模式函数•MM_TEXT-默认映像模式,x,y表示一个屏幕像素或打印机点阵。•MM_HIENGLISH-x,y相当于屏幕或打印页上的1/1000英寸,由Windows系统决定屏幕上多少个像素相当于1/1000英寸•MM_LOENGLISH-x,y相当于屏幕或打印页上的1/1000英寸•MM_HIMETRIC-x,y相当于屏幕或打印纸上1/100mm•MM_LOMETRIC-x,y相当于屏幕或打印纸上1/10mm•MM_TWIPS-x,y相当于屏幕设备上的1/1440英寸•MM_ANISOTROPIC-x方向的一个单位不同于