本章内容2.1MFC上机操作步骤2.2基本绘图函数2.3本章小结2.4习题2.2MFC上机操作步骤关于工具VisualC++6.0是目前使用极为广泛的可视化编程平台。使用VC++语言开发的图形,与使用TurboC语言开发的图形相比,不仅可以显示真彩色,而且可以实现交互式绘图。MicrosoftFoundationClassLibrary微软基类库MFC是以C++形式封装的WindowsAPI(ApplicationProgramInterface),包含了一百多个已经定义好的常用类。MFC的上机操作过程启动MicrosoftVisualC++6.0从【File】菜单中选择【New】命令,弹出【New】对话框,切换到【Projects】选项卡。在左边窗口中选择MFCAppWizard(exe),在右边的Projectsname文本框中键入应用程序名,这里输入Test,在Location文本框中出现用于存放应用程序的根目录,这里设置为D:\Test。其余保持默认值。如图所示。单击【OK】按钮。在对话框【MFCAppWizard-Step1】中,选中SingleDocument单选按钮,其余保持默认值,如图所示。单击【Finish】按钮结束。完成上述步骤后,应用程序Test的框架即被生成,出现程序工作区。如图所示。在工作区的【ClassView】面板中显示所创建的类和成员函数在【ResourceView】面板中显示所创建的资源在【FileView】面板中显示源程序文件,主要包括程序源文件(*.CPP)、头文件(*.h)和资源文件(*.ico、*.bmp等)从【ClassView】面板可以看出CTestApp是应用的主函数类,用来处理消息。MFC中的数据是存储在CTestDoc类文档中结果的显示是在CTestView类中文档类负责管理和维护数据本身视图类负责处理用户鼠标和键盘的操作全部展开FileView面板后,显示如图的界面内容本书后续的编程过程中一般使用的是CTestView类的TestView.h头文件和TestView.cpp源文件。OnDraw(CDC*pDC)函数voidCTestView::OnDraw(CDC*pDC){CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);}pDC定义为CDC类的指针。pDoc通过GetDocument()函数得到了指向文档类CTestDoc的指针。OnDraw(CDC*pDC)函数voidCTestView::OnDraw(CDC*pDC){CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);}ASSERT_VALID(pDoc)函数使pDoc指针有效。使用pDC指针,可以对CDC类的成员函数进行操作。注意:OnDraw函数是由系统框架直接调用的,程序一运行就会自动执行。!按钮点击工具条上的“!”按钮,就可以直接编译、运行程序尽管未编写一句代码,但Test程序已经形成一个可执行程序框架返回2.2基本绘图函数在Windows平台上,应用程序的图形设备接口(GraphicsDeviceInterface,GDI)被抽象化为设备上下文(DeviceContent,DC)在微软基类库MFC中,CDC类是定义设备上下文对象的基类,所有绘图函数都在CDC基类中定义。2.2节内容2.2.1CDC类结构和GDI对象2.2.2映射模式2.2.3CDC类的主要绘图成员函数2.2.4设备上下文的调用和释放2.2.5VC++绘制图形的几种方法2.2.1CDC类结构和GDI对象1.CDC类CDC类有4个派生类CClientDC类显示器客户区设备上下文类CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏的空白区域)进行绘图点(0,0)是客户区的左上角其构造函数调用GetDC函数其析构函数调用ReleaseDC函数CMetaFileDC类Windows图元文件设备上下文类CMetaFileDC封装了在一个Windows图元文件中绘图的方法图元文件是一系列与设备无关的图片的集合,由于它对图像的保存比像素更精确,因而往往在要求较高的场合下使用例如,AutoCAD中的图像保存等。CPaintDC类是成员函数OnPaint中使用的显示器上下文类CPaintDC只在处理WM_PAINT消息中使用,用户一旦获得相关的CDC指针,就可以将它当做任何设备环境(包括屏幕、打印机)的指针来使用CPaintDC类的构造函数会自动调用CWnd::BeginPaintCPaintDC类的析构函数则会自动调用CWnd::EndPaintCWindowDC类整个窗口区域的显示器设备上下文类,包括客户区和非客户区CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角其构造函数调用GetWindowDC其析构函数调用ReleaseDC2.常用绘图类常用绘图类常用绘图类CPoint类:存放点坐标(x,y)。CRect类:存放矩形左上角顶点和右下角顶点的坐标(top,left,right,bottom)Csize类:存放矩形的宽度和高度的坐标(cx,cy),其中cx为矩形的宽度,cy为矩形的高度。3.绘图工具类绘图工具类绘图工具类CGdiObject类:GDI绘图工具的基类,一般不能直接使用。CBitmap:封装了一个GDI位图,提供位图操作的接口。CBrush类:封装了GDI画刷,可以选作设备上下文的当前画刷。画刷用于填充图形内部。绘图工具类CFont:封装了GDI字体,可以选作设备上下文中的当前字体。CPallette:封装了GDI调色板,提供应用程序和显示器之间的颜色接口。CPen:封装了GDI画笔,可以选作设备上下文的当前画笔。画笔是用于绘制图形边界线。2.2.2映射模式把图形显示在屏幕坐标系中的过程称为映射根据映射模式的不同可以分为逻辑坐标设备坐标逻辑坐标的单位是米制尺度或其它与字体相关的尺度设备坐标的单位是像素映射模式模式代码坐标单位坐标系特征MM_TEXT一个像素设备坐标。屏幕左上角为坐标原点,X轴向右,Y轴向下。MM_LOMETRIC0.1mm逻辑坐标。坐标原点位置可以自由设置,X轴向右,Y轴向上。MM_HIMETRIC0.01mm逻辑坐标。坐标原点位置可以自由设置,X轴向右,Y轴向上。MM_LOENGLISH0.01inch逻辑坐标。坐标原点位置可以自由设置,X轴向右,Y轴向上。MM_HIENGLISH0.001inch逻辑坐标。坐标原点位置可以自由设置,X轴向右,Y轴向上。映射模式模式代码坐标单位坐标系特征MM_TWIPS1/440inch或1/20点逻辑坐标。坐标原点位置可以自由设置,X轴向右,Y轴向上。MM_ISOTROPIC用户自定义,X轴和Y轴比例相等逻辑坐标。坐标原点位置可以自由设置,X轴和Y轴方向自定义。MM_ANSIOTROPIC用户自定义,X轴和Y轴比例独立设置逻辑坐标。坐标原点位置可以自由设置,X轴和Y轴方向自定义。映射模式在缺省情况下,一般使用的是设备坐标系MM_TEXT,坐标原点位于客户区的左上角,X轴水平向右,Y轴垂直向下,坐标基本单位为一个像素。1.设置映射模式函数类属:CDC::SetMapMode原型:virtualintSetMapMode(intnMapMode);返回值:原映射模式。参数说明:nMapMode是表2-1的模式代码。2.设置窗口范围函数类属:CDC::SetWindowExt原型:virtualCSizeSetWindowExt(intcx,intcy);返回值:原窗口范围的CSize对象。参数说明:cx窗口x范围的逻辑坐标,cy窗口y范围的逻辑坐标。3.设置视区范围函数类属:CDC::SetViewportExt原型:virtualCSizeSetViewportExt(intcx,intcy);返回值:原视区范围的CSize对象。参数说明:cx视区x范围的逻辑坐标,cy视区y范围的逻辑坐标。4.设置视区坐标原点函数类属:CDC::SetViewportOrg原型:virtualCPointSetViewportOrg(intx,inty);返回值:原视区原点的CPoint对象。参数说明:参数x,y是视区的新原点坐标。2.2.3CDC类的主要绘图成员函数1.绘制像素函数类属:CDC::SetPixel原型:COLORREFSetPixel(intx,inty,COLORREFcrColor);设置某像素点的RGB值1.绘制像素函数参数说明:SetPixel函数中,COLORREF是32位颜色数据类型;第一和第二个参数x,y是像素点位置的逻辑坐标值,第三个参数crColor是像素点的颜色值,COLORREF型变量可以利用RGB(bRed,bGreen,bBlue)来指定相应的颜色值,每种颜色用一个字节表示,可以被设定为0~255之间的任意值,0代表无色,255代表全色。2.获取像素颜色函数类属:CDC::GetPixel原型:COLORREFGetPixel(intx,inty)const;返回值:指定像素的RGB值。参数说明:得到指定像素的RGB颜色值例4在屏幕的(20,20)坐标位置处绘制一个红色像素点。然后取出该像素点的颜色,在屏幕的(60,20)坐标处绘制一个相同颜色的像素点。voidCTestView::OnDraw(CDC*pDC){CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);COLORREFc;pDC-SetPixel(20,20,RGB(255,0,0));c=pDC-GetPixel(20,20);pDC-SetPixel(60,20,c);}语句:COLORREFc;注释:变量c用于存放像素点的颜色值语句:pDC-SetPixel(20,20,RGB(255,0,0));注释:在屏幕的(20,20)坐标位置处,绘制一个红色的像素点语句:c=pDC-GetPixel(20,20);注释:c保存该像素点的颜色语句:pDC-SetPixel(60,20,c);注释:在像素点(60,20)处以颜色值c绘制一个像素点。3.画笔函数画笔是用来绘制直线、曲线或图形的边界线,是绘图工具类之一画笔通常具有线型、宽度和颜色三种属性画笔的线型通常有实线、虚线、点线、点划线、双点划线、不可见线和内框架线7种,这些线型都是以PS_为前缀的预定义标识符3.画笔函数默认的画笔是一个像素单位的黑色实线要想更换画笔,可以在创建新画笔对象后,将其选入设备上下文,就可使用新画笔进行绘图。画笔的风格风格代码线型宽度颜色PS_SOLID实线任意指定纯色PS_DASH虚线1(不可任意指定)纯色PS_DOT点线1(不可任意指定)纯色PS_DASHDOT点划线1(不可任意指定)纯色PS_DASHDOTDOT双点画线1(不可任意指定)纯色PS_NULL不可见线1(不可任意指定)纯色PS_INSIDEFRAME内框架线任意指定纯色(1)创建画笔函数类属:CPen::CreatPen原型:BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);返回值:非零。参数说明:第一个参数nPenStyle是画笔的风格代码第二个参数nWidth是画笔的宽度第三个参数crColor是画笔的颜色。(2)选择画笔函数类属:CPen::SelectObject原型:Cpen*SelectObject(Cpen*pPen);返回值:被替代画笔的指针。参数说明:参数pPen是Cpen类的被选中的新画笔对象指针。本函数把原画笔换成新画笔,同时返回指向原画笔的指针