1、:OnNewDocument() if (!Cdocument:OnNewDocument() return FALSE;/ TODO: add reinitialization code here / (SDI documents will reuse this document) r=CRect(100,60,260,100); s=”同舟共济 自强不息”;return TRUE; 说明:阴影部分为添加的代码。(4)在工作区的“ Class View ”中展开视图类 CTESTView 类,找到其成员函数 OnDraw() ,添加输出矩形框和文字的代码:void CTESTView:OnD
2、raw(CDC* pDC) CTESTDoc* pDoc = GetDocument();ASSERT_VALID(pDoc); add draw code for native data here pDC-Rectangle(pDoc-r);TextOut(110,70,pDoc-s); GetDocument() 是视图类的一个重要成员函数,其返回值是指向当前文档的指针。视图类中的成员函数通过它访问文档类的公有数据成员。 函数 OnDraw() 是实现输出的关键函数,绝大多数的显示工作都是在这个函数中完成的。其参数 pDC 指向窗口中央的客户区对象,程序使用了客户区对象的 Rectangl
3、e 和 TextOut 函数绘制矩形和输出文字。 ( 5 ) 运行程序,结果如图所示。(一) SDI 应用程序框架 1应用程序类 每个应用程序类必须从 CWinApp 派生出自己的应用程序类,该类封装了包括初始化、运行和结束的整个过程,其名称是 AppWizard 根据工程名称自动命名的,规则如下:(1)如果工程名符合标识符的命名规则,则应用程序类名由字母 C 、工程名和 App 三部分组成。例如,工程名为 TEST ,则应用程序类名为 CTESTApp 。(2)如果工程名以数字开始,则应用程序类名由字母 Cmy 、工程名和 App 三部分组成。例如,工程名为 1TEST ,则应用程序类名为
4、CMy1TESTApp 。(3)忽略工程名的汉字。文档类和视图类的命名规则与应用程序类类似,区别在于在后面分别添加了 Doc 和 View 。2窗口框架类 从 CMainWnd 派生,提供了一个 SDI 窗口的所有功能,如显示一个标题、一个菜单栏、一个工具栏等。所有 SDI 应用程序窗口框架类都是 CMainFrame ,但是性质是有区别的。3文档类 从 CDocument 类派生出来,是应用程序进行数据定义和初始化的地方 。文档类的数据成员只有被说明成公有成员才能被视图类中的成员函数访问,其重要成员函数是 OnNewDocument() ,是进行数据成员初始化的地方。程序开始时会自动调用该函
5、数。4视图类 从 CView 中派生出来, 是程序的用户界面,用于显示、打印存储在文档类对象中的数据,并管理与用户的交互。重要成员函数有:(1) GetDocument() 函数 该函数的返回值是指向与当前视图相关联的文档对象的指针,因而通过它可以访问文档类对象中的公有私有成员。其一般使用形式为:CTESTDoc* pDoc = GetDocument(); 在不同的应用程序中, pDoc 所指向的文档类对象的名称是不一样的。若工程名称为 TEST ,则文档类的名称为 CTESTDoc ,若工程名为 ABC ,则文档类名为 CABCDoc ,则应用 CABCDoc* pDoc 定义。 在 On
6、Draw函数中,这个语句是自动生成的。在用户自定义的视图类成员函数中,如果需要访问文档类对象的公有数据成员,则应添加这样的语句。(2) OnDraw() 函数 在视图类中, OnDraw() 是一个很重要的成员函数,用于实现输出。一般来说,窗口中的内容都是 OnDraw() 输出的。初始的 OnDraw()函数如下:void CTESTView: / 获得指向文档类对象的指针 / 检查 pDoc 是否有效,若无效结束程序 OnDraw()函数有两种调方法: 自动调用:当窗口发生变化视图需要重新绘制时,应用程序会自动调用该函数。 手工调用:当程序中的数据改变了需要重新显示时,可以通过调用 Inv
7、alidate() 和 InvalidateRect() 函数,引发对 Ondraw() 的调 用。需要注意的是,不是直接调用 Ondraw()函数。Invalidate(TRUE) / 擦除窗口原有的内容,重新绘制。Invalidate(FALSE) / 窗口原有的内容保留,再进行绘制。InvalidateRect( 矩形 , TRUE) / 擦除矩形区域内原有内容,重新绘制这个区域。InvalidateRect( 矩形 , FALSE) / 矩形区域内原有内容保留,再绘制这个区域。注:要设置文档标题,可在文档类的OnNewDocument()函数里使用CDocument:SetTitle(
8、“标题名”)2.2 图形和文字的输出 窗口中央的客户区是一个输出文字和图形的区域。简单的文字和图形输出 文字输出 形式:BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount);从坐标 (x,y) 开始显示 lpszString 字符串,其中参数 nCount 指定字符串中的字节数。画点 COLORREF SetPixel(int x, int y, COLORREF crColor);COLORREF SetPixel(POINT point, COLORREF crColor); POINT 是 MFC 定义的结构类型,表示平面上
9、的一个点。它的两个重要元素是 x 和 y ,分别表示一个点的 x 坐标值和 y 坐标值。与 POINT 类似的是 CPoint 类,两个数据成员也是 x 和 y 。 COLORREF 是一个 32 位整数类型,用于表示颜色,其第 0 、 1 、 2 字节分别存放了一种颜色的红、绿、蓝的值。用三种颜色合成一种颜色的函数是 RGB ,例如:COLORREF C1=RGB(0, 0, 0) ;/ 合成黑色 COLORREF C2=RGB(255, 255, 255); / 合成白色 COLORREF C3=RGB(255, 0, 0); / 合成红色 COLORREF C4=RGB(0, 255,
10、0); / 合成绿色 COLORREF C5=RGB(0, 0,255); / 合成蓝色 COLORREF C6=RGB(255, 255, 0); / 合成亮黄色 COLORREF C7=RGB(0,255, 255); / 合成青色 COLORREF C8=RGB(255, 0, 255); / 合成品红色 COLORREF C9=RGB(0, 0,128); / 合成深蓝色 COLORREF C10=RGB(0, 128, 0); / 合成深绿色 COLORREF C11=RGB(128, 128, 128); / 合成深灰色 COLORREF C12=RGB(128, 128, 128
11、); / 合成浅灰色 使用指定颜色 crColor 在坐标 (x,y) 或点 point 处画一个点,返回用于画点的颜色。画线 画线需要调用两个函数:首先调用 MoveTo 函数确定线段的起点,然是调用 LineTo 确定线段的终点。形式 :CPoint MoveTo(int x,int y);CPoint MoveTo(POINT point);BOOL LineTo(int x, int y);BOOL LineTo(POINT point); ( x,y)或 point 是线段的起点或 终点坐标。 画矩形 BOOL Rectangle(int x1, int y1, int x2, in
12、t y2);BOOL Rectangle(LPCRECT lpRect); (x1,y1) 和 (x2,y2) 是所画矩形的左上角和右下角坐标 , lpRect 是指向矩形的指针。画椭圆 BOOL Ellipse(int x1, int y1, int x2, int y2);BOOL Ellipse(LPCRECT lpRect);(x1,y1) 和 (x2,y2) 是椭圆外接矩形的左上角和右下角坐标 , lpRect 是指向外接矩形的指针。获取客户区的大小 使用 Wnd 类的成员函数 GetClientRect 可以将客户区的坐标放入一个 CRect 类的对象中,然后调用成员函数计算到高度
13、和宽度。void GetClientRect( LPRECT lpRect ) const;【例2.2】改变窗口时,矩形框和文字总是显示在窗口的中央OnDraw(CDC* pDC) CTESTDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CRect a,b; int w=160; int h=40; GetClientRect(&a); b.left=(a.Width()-w)/2; b.top=(a.Height()-h)/2; b.right=b.left+
14、w; b.bottom=b.top+h; pDC-Rectangle(b);TextOut(b.left+10,b.top+10,同舟共济、自强不息!);【例2.3】 编写一个程序,绘制如图所示的 -22 之间的 sin 曲线。因为需要使用 sin() 函数,所以在 TEST.CPP 的开始添加文件包含命令。#include math.h程序代码:CRect rect;GetClientRect(rect);int x0=rect.Width()/2;int y0=rect.Height()/2;pDC-MoveTo(20,y0);LineTo(rect.Width()-20,y0);Move
15、To(x0,20);LineTo(x0,rect.Height()-20);double step=3.14159/100;for(int i=-200;iSelectObject(&pen); / 选用新的画笔pen ,让oldpen指向旧的画笔pDC-MoveTo(10,10);LineTo(50,50);SelectObject(oldpen); / 恢复使用旧的画笔 (1) CreatePen() 是 CPen 的成员函数,用于创建画笔。其使用形式为:BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );其中: nP
16、enStyle 为所画线的样式,其取值见表; nWidth 线的宽度; crColor 为线的颜色。(2) SelectObject() 是 CDC 类的成员函数,其作用是将一个新的 GDI 对象选入到设备环境中,新选用的对象取代原来的对象,然后返回指向原对象的指针。函数原型为:CPen* SelectObject( Cpen* pPen ); / 选用新的画笔 Cbrush* SelectObject( Cbrush* pBrush ); / 选用新的画刷 virtual Cfont* SelectObject( Cfont* pFont ); / 选用新的字体 Cbitmap* Selec
17、tObject( Cbitmap* pBitmap ); / 选用新的位图 自定义画刷 画刷是用来填充图形的工具。 CBrush 是 MFC 中的一个类,它封装了一个 Windows GDI 画刷,并提供了用于操作画刷对象的若干方法。画刷的创建和使用过程一般为:CBrush brush; / 定义画刷对象 brush brush.CreateHatchBrush(HS_CROSS,RGB(0,255,0); / 构造绿色十字线风格的画刷 brush); / 选择一个新的画刷 Ellipse(100,10,200,110); / 用新的画刷画圆 (1) CreateHatchBrush () 是
18、 CBrush 的成员函数,用于创建画刷。BOOL CreateHatchBrush(int nIndex , COLORREF crColor ); nIndex 指定了阴影风格,其取值见表; crColor 为画刷的颜色。(2)创建画刷的另一个函数是 CreateSolidBrush() ,其作用是创建用单一颜色填充的画刷。其函数原形为:BOOL CreateSolidBrush(COLORREF crColor );【例2.4】编写一个程序,输出如图所示的图形。 CPen pen,*oldpen;pen.CreatePen(PS_SOLID,3,RGB(255,0,0);oldpen=p
19、DC-LineTo(100,100);Cbrush brush;brush.CreateHatchBrush(HS_CROSS,RGB(0,255,0);Ellipse(220,10,320,110);MoveTo(320,100);LineTo(410,10); pen.DeleteObject();/释放画笔资源brush.DeleteObject(); 位图处理 CBitmap 是 MFC 中的一个类,它封装了 Winndows GDI 的位图处理,其成员函数主要是装载和操作位图。通过一个实例说明显示位图的一般过程。【例2.5】编一程序 显示 Windows 主目录中的 Soap Bub
20、bles.bmp ,如图所示。(1)导入位图 导入位图就是把存放在磁盘上的位图文件作为资源导入到应用程序中,方法是:选择“插入 | 资源”命令,在弹出的“插入资源”对话框中,选定“ Bitmap ”,然后选择“导入”命令导入 Soap Bubbles.bmp 。(2)装载位图 装载位图就是把应用程序位图资源装载到一个 Cbitmap 对象中。CBitmap b;b.LoadBitmap(IDB_BITMAP1); /LoadBitmap 将位图资源装载到 CBitmap 对象 (3)读取位图信息 BITMAP bm; / 说明 bm 为 BITMAP 结构类型的变量 b.GetBitmap(&
21、bm); / 把位图的大小等信息读入 bm 中 int w=bm.bmWidth; / 把位图的宽度赋给 w int h=bm.bmHeight; / 把位图的高度赋给h(4)构造内存设备环境,并将位图装入该设备环境 CDC m;m.CreateCompatibleDC(NULL);m.SelectObject(&b);(5)将位图从内存设备环境复制到真正的设备环境中 StretchBlt(0,0,(int)w*f,(int)h*f,&m,0,0,w,h,SRCCOPY);BitBlt 是 CDC 类的成员函数,用于复制位图到真正的设备环境中。其函数原型为: BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1