1、第 一 章 概述 1-1 简述计算机程序设计语言的发展历程。 解: 迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C+语 言是一种面向对象的编程语言,也属于高级语言。 1-2 面向对象的编程语言有哪些特点? 解: 面向对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直 接的描述客观世界中存在的事物以及它们之间的关系。面向对象的编程语言将客观事物看 作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动 态特征) ,形成类。通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发 周期,并使得软件风格统一。因此,面
2、向对象的编程语言使程序能够比较直接地反问题域 的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。 C+语言是目前应用最广的面向对象的编程语言。 1-3 什么是结构化程序设计方法?这种方法有哪些优点和缺点? 解: 结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分为若干个基本 模块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选 择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计由 于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的 程序系统设计任务分解成许多易于控制和处
3、理的子任务,便于开发和维护。 虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把 数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程 都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用 性差。 由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来 越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面 向过程的方法来开发和维护都将非常困难。 1-4 什么是对象?什么是面向对象方法?这种方法有哪些特点? 解: 从一般意义上讲,对象是现实世界中一个实际存在的事物,它
4、可以是有形的,也可以是无 形的。对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。面向对象方 法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位, 由一组属性和一组行为构成。 面向对象的方法将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整 体-对象。对同类型对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法 进行处理。类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行 通讯。这样,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好 的保障。通过实现继承与多态性,还可以大大提高程序的可重用性,使得
5、软件的开发和维 护都更为方便。 面向对象方法所强调的基本原则,就是直接面对客观存在的事物来进行软件开发,将人们 在日常生活中习惯的思维方式和表达方式应用在软件开发中,使软件开发从过分专业化的 方法、规则和技巧中回到客观世界,回到人们通常的思维。 1-5 什么叫做封装? 解: 封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单 位,并尽可能隐蔽对象的内部细节。 1-6 面向对象的软件工程包括哪些主要内容? 解: 面向对象的软件工程是面向对象方法在软件工程领域的全面应用,它包括面向对象的分析 (OOA) 、面向对象的设计(OOD) 、面向对象的编程(OOP) 、面向对象
6、的测试(OOT)和 面向对象的软件维护(OOSM)等主要内容。 1-7 简述计算机内部的信息可分为几类? 解: 计算机内部的信息可以分成控制信息和数据信息二大类;控制信息可分为指令和控制字两 类;数据信息可分为数值信息和非数值信息两类。 1-8 什么叫二进制?使用二进制有何优点和缺点? 解: 二进制是基数为 2,每位的权是以 2 为底的幂的进制,遵循逢二进一原则,基本符号为 0 和 1。采用二进制码表示信息,有如下几个优点:1.易于物理实现;2.二进制数运算简单; 3.机器可靠性高;4.通用性强。其缺点是它表示数的容量较小,表示同一个数,二进制较其 他进制需要更多的位数。 1-9 请将以下十进
7、制数值转换为二进制和十六进制补码: (1 ) 2 (2)9 (3)93 (4 ) -32 (5)65535 (6)-1 解: (1 ) (2 )10 = (10 )2 = (2 )16 (2 ) (9 )10 = (1001)2 = (9)16 (3 ) (93)10 = (1011101)2 = (5D)16 (4 ) (-32)10 = (11100000)2 = (E0)16 (5 ) (65535)10 = (11111111 11111111)2 = (FFFF)16 (6 ) (-1 )10 = (11111111 11111111)2 = (FFFF)16 1-10 请将以下数值
8、转换为十进制: (1 ) (1010)2 (2) (10001111)2 (3 ) (01011111 11000011)2 (4 ) (7F )16 (5) (2D3E)16 (6) (F10E)16 解: (1)(1010 )2 = (10)10 (2)(10001111)2 = (143)10 (3)(01011111 11000011)2 = (24515)10 (4)(7F)16 = (127)10 (5)(2D3E)16 = (11582)10 (6)(F10E )16 = (61710)10 1-11 简要比较原码、反码、补码等几种编码方法。 解: 原码:将符号位数字化为 0 或
9、 1,数的绝对值与符号一起编码,即所谓“符号绝对值 表示“的编码。 正数的反码和补码与原码表示相同。 负数的反码与原码有如下关系: 符号位相同(仍用 1 表示) ,其余各位取反(0 变 1,1 变 0)。 补码由该数反码的最末位加 1 求得。 第 二 章 C+简单程序设计 2-1 C+语言有那些主要特点和优点? 解: C+语言的主要特点表现在两个方面,一是全面兼容 C,二是支持面向对象的方法。 C+是 一个更好的 C,它保持了 C 的简洁、高效、接近汇编语言、具有良好的可读性和可移植性 等特点,对 C 的类型系统进行了改革和扩充,因此 C+比 C 更安全,C+ 的编译系统能检查 出更多的类型错
10、误。 C+语言最重要的特点是支持面向对象。 2-2 下列标识符哪些是合法的? Program, -page, _lock, test2, 3in1, mail, A_B_C_D 解: Program, _lock, test2, A_B_C_D 是合法的标识符,其它的不是。 2-3 例 2.1 中每条语句的作用是什么? #include void main(void) cout x | y = x y = x; 2-17 修改下面这个程序中的错误,改正后它的运行结果是什么? #include void main() int i int j; i = 10; /* 给 i 赋值 j = 20;
11、/* 给 j 赋值 */ cout i; cout flag; if ( toupper(flag) = Y) cout score; if (score100 | score c; choice = toupper(c); if (choice = A) cout choice; switch(toupper(choice) case A: cout m; if (n m) cout m; if (n m) cout one; cout -1) cout i; if (prime(i) cout i ; cout i ; cout number; cout n; cout length; c
12、out radius; Circle p(radius); cout i +; class Z public: void f(X* x) x-i += 5; ; #endif / MY_X_Y_Z_H 程序运行输出:无 5-14 定义 Boat 与 Car 两个类,二者都有 weight 属性,定义二者的一个友元函数 totalWeight(),计算二者的重量和。 解: 源程序: #include class Boat; class Car private: int weight; public: Car(int j)weight = j; friend int totalWeight(Car
13、 ; class Boat private: int weight; public: Boat(int j)weight = j; friend int totalWeight(Car ; int totalWeight(Car void main() Car c1(4); Boat b1(5); cout myArrayi; for (i = 0; i=a return num; void main() char text100; cout str1; cout 0) cout str1; cout gradesi; total = 0; for (i = 0; i itsLen) retu
14、rn itsMyStringitsLen-1; else return itsMyStringoffset; MyString MyString:operator+(const MyString MyString temp(totalLen); for (unsigned short i = 0; i dataij; cout n; p = new intn*n; cout pi*n + j; cout fn2(); pDerivedClass-fn1(); pDerivedClass-fn2(); 程序运行输出: 调用派生类的函数 fn1() 调用派生类的函数 fn2() 调用基类的函数 f
15、n1() 调用基类的函数 fn2() 调用派生类的函数 fn1() 调用派生类的函数 fn2() 7-12 为例 9-1 的吹泡泡程序加一版权(About )对话框。 然后修改例 9-1 的程序,加入以下内容: 程 序: 1在程序首部加上文件包含命令 #include “resource.h” 2在框架窗口类之前加入从 CDialog 类派生的对话框类: / 对话框类 class CAboutDlg: public CDialog public: CAboutDlg(); enum IDD = IDD_DIALOG1; ; inline CAboutDlg:CAboutDlg():CDialo
16、g(CAboutDlg:IDD) 3在框架窗口类中添加响应鼠标右键消息的代码,包括消息响应函数说明、消息响应宏和 消息响应函数定义。鼠标右键消息响应函数为: void CMyWnd:OnRButtonDown(UINT nFlags, CPoint point) CAboutDlg dlg; dlg.DoModal(); 7-13 签名留念簿程序。该程序模仿签名簿,用户使用鼠标左键点击窗口客户区后会弹出一 个对话框,输入姓名后可在鼠标点击位置显示出该签名。签名的颜色、字体大小和方向随 机确定。 说 明:项目建立及添加对话框模板资源的方法同例 14-1。修改对话框模板的 ID 为 IDD_NAM
17、EDLG,Caption 为“签名对话框” ,并添加一个静态文本控件(Caption 改为“签名” )和一个编辑控件(ID 改为 IDC_EDITNAME) 。 程 序: / Example 14-2:签名留念簿程序 #include #include “resource.h“ / 对话框类 class CNameDlg: public CDialog public: CPoint m_pointTopLeft; CString m_strNameEdit; public: CNameDlg(); enum IDD = IDD_NAMEDLG; protected: virtual void
18、DoDataExchange(CDataExchange* pDX); virtual BOOL OnInitDialog(); ; / 对话框类的构造函数 CNameDlg:CNameDlg():CDialog(CNameDlg:IDD) m_strNameEdit = _T(“); / 数据交换和数据检验 void CNameDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); DDX_Text(pDX, IDC_EDITNAME, m_strNameEdit); DDV_MaxChars(pDX, m_st
19、rNameEdit, 20); / 初始化对话框 BOOL CNameDlg:OnInitDialog() CDialog:OnInitDialog(); CRect rect; GetWindowRect( rect = CRect(m_pointTopLeft, rect.Size(); MoveWindow(rect); return TRUE; / 签名类 class CSignal: public CObject CString m_sName; / 姓名 CPoint m_pointSignal; / 签名位置 int m_nHeight; / 字体高 int m_nColor;
20、/ 签名颜色 int m_nEscapement; / 签名倾角 public: CSignal() void SetValue(CString name,CPoint point,int height,int color, int escapement); void ShowSignal(CDC *pDC); ; / 签名类成员函数 void CSignal:SetValue(CString name,CPoint point,int height,int color, int escapement) m_sName = name; m_pointSignal = point; m_nHei
21、ght = height; m_nColor = color; m_nEscapement = escapement; / 显示签名 void CSignal:ShowSignal(CDC *pDC) CFont *pOldFont, font; font.CreateFont(m_nHeight, 0, m_nEscapement,0, 400, FALSE,FALSE, 0, OEM_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH, “楷体“); pOldFont = pDC-S
22、electObject( switch(m_nColor) case 0: pDC-SetTextColor(RGB(0, 0, 0); break; case 1: pDC-SetTextColor(RGB(255, 0, 0); break; case 2: pDC-SetTextColor(RGB(0, 255, 0); break; case 3: pDC-SetTextColor(RGB(0, 0, 255); break; pDC-TextOut(m_pointSignal.x, m_pointSignal.y, m_sName); pDC-SelectObject(pOldFon
23、t); / 框架窗口类 #define MAX_NAME 250 class CMyWnd: public CFrameWnd CSignal m_signalListMAX_NAME; int m_nCount; public: CMyWnd(): m_nCount(0) protected: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() ; / 消息映射 BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd) ON_W
24、M_LBUTTONDOWN() ON_WM_PAINT() END_MESSAGE_MAP() / 框架窗口类的成员函数 / 鼠标右键消息响应函数 void CMyWnd:OnLButtonDown(UINT nFlags, CPoint point) if(m_nCount ShowWindow(m_nCmdShow); this-m_pMainWnd = pFrame; return TRUE; / 全局应用程序对象 CMyApp ThisApp; 7-14 将例 14-2 的签名留念簿中的对话框改为无模式对话框。用户可用鼠标右键调出签名 对话框,并在不退出该对话框的情况下用鼠标左键将输入
25、的签名显示在窗口客户区。 说 明:在向项目中添加对话框模板资源时,要在其属性对话框的 More Styles 页中选择 Visible 项。其他同例 14-2。 程 序: 该程序中的签名类 CSignal 和应用程序类与上例相同,因此下面仅列出了框架窗口类和对话 框类。由于这两个类的成员函数中存在相互引用的情况,所以我们将框架窗口类的声明放 在前面,接下来是对话框类的定义,并在框架窗口类之前加入了一条对对话框类的声明。 最后是这两个类的成员函数定义。 / 框架窗口类 #define MAX_NAME 250 class CNameDlg; class CMyWnd: public CFrame
26、Wnd CSignal m_signalListMAX_NAME; int m_nCount; CNameDlg *m_pNameDlg; public: CMyWnd(); CMyWnd(); protected: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() ; / 对话框类 class CNameDlg: public CDi
27、alog public: BOOL m_bActive; CString m_strNameEdit; enum IDD = IDD_NAMEDLG; CNameDlg(); BOOL Create(); protected: virtual void DoDataExchange(CDataExchange* pDX); virtual BOOL OnInitDialog(); virtual void OnOK(); virtual void OnCancel(); ; / 框架窗口类的消息映射 BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd) ON_WM_LBUT
28、TONDOWN() ON_WM_RBUTTONDOWN() ON_WM_PAINT() END_MESSAGE_MAP() / 框架窗口类的成员函数 / 框架窗口类的构造函数 CMyWnd:CMyWnd() m_nCount = 0; m_pNameDlg = new CNameDlg; / 框架窗口类的析构函数 CMyWnd:CMyWnd() delete m_pNameDlg; / 鼠标右键消息响应函数 void CMyWnd:OnRButtonDown(UINT nFlags, CPoint point) if(m_pNameDlg-m_bActive) m_pNameDlg-SetAc
29、tiveWindow(); / 激活对话框 else m_pNameDlg-Create(); / 显示对话框 / 鼠标左键消息响应函数 void CMyWnd:OnLButtonDown(UINT nFlags, CPoint point) if(m_nCount m_strNameEdit; m_signalListm_nCount.SetValue(name, point, height, color, escapement); m_nCount+; Invalidate(); / 绘制框架窗口客户区函数 void CMyWnd:OnPaint() CPaintDC dc(this);
30、for(int i=0; iSelectObject( pDC-SetTextColor(m_colorSignal); pDC-TextOut(m_pointSignal.x, m_pointSignal.y, m_strSignal); pDC-SelectObject(pOldFont); / 框架窗口类 #define MAX_NAME 250 class CMyWnd: public CFrameWnd CSignal m_signalListMAX_NAME; / 签名数组 int m_nCount; / 签名数量 LOGFONT m_fontSignal; / 签名字体 COLO
31、RREF m_colorSignal; / 签名颜色 public: CMyWnd(); protected: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() ; / 消息映射 BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd) ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() ON
32、_WM_PAINT() END_MESSAGE_MAP() / 框架窗口类的成员函数 CMyWnd:CMyWnd() m_nCount = 0; m_colorSignal = RGB(0, 0, 0); m_fontSignal.lfHeight = 40; m_fontSignal.lfWidth = 0; m_fontSignal.lfEscapement = 0; m_fontSignal.lfOrientation = 0; m_fontSignal.lfWeight = 400; m_fontSignal.lfItalic = FALSE; m_fontSignal.lfUnder
33、line = FALSE; m_fontSignal.lfStrikeOut = 0; m_fontSignal.lfCharSet = OEM_CHARSET; m_fontSignal.lfOutPrecision = OUT_DEFAULT_PRECIS; m_fontSignal.lfClipPrecision = CLIP_DEFAULT_PRECIS; m_fontSignal.lfQuality = DEFAULT_QUALITY; m_fontSignal.lfPitchAndFamily = DEFAULT_PITCH; strcpy(m_fontSignal.lfFaceN
34、ame, “Arial“); / 鼠标右键消息响应函数 void CMyWnd:OnLButtonDown(UINT nFlags, CPoint point) if(m_nCount ShowWindow(SW_SHOWMAXIMIZED); this-m_pMainWnd = pFrame; return TRUE; / 全局应用程序对象 CMyApp ThisApp; 7-16 为例 9-3 的吹泡泡程序添加颜色选择对话框,使其可以绘出五颜六色的泡泡。 程 序:在例 9-3 的程序基础上作如下修改: 1在程序首部添加文件包含命令: #include 2在框架窗口类声明中添加一个 COLO
35、RREF 类型的数组,存放各泡泡的颜色: COLORREF m_colorBubble MAX_BUBBLE; 3修改鼠标左键消息映射函数,添加使用颜色选择公用对话框的代码: void CMyWnd:OnLButtonDown ( UINT nFlags, CPoint point ) if(m_nBubbleCount m_nBubbleCount; for(int i=0; i m_rectBubblei; 7-18 修改例 12-1 的程序并观察其打印结果。 程 序: 在例 12-1 程序的视图类 CMyView 类的成员函数 OnDraw()中,添加代码沿窗口客户区轮 廓画一矩形: v
36、oid CMyView:OnDraw(CDC* pDC) CRect rect; GetClientRect( pDC-Rectangle(rect); CMyDoc* pDoc = GetDocument(); / 取文档指针 ASSERT_VALID(pDoc); pDC-SelectStockObject(LTGRAY_BRUSH); / 在视图上显示文档数据 for(int i=0; iGetListSize(); i+) pDC-Ellipse(pDoc-GetBubble(i); 7-19 改进吹泡泡程序,使之打印输出与屏幕显示的比例相近。 程 序: 在例 12-1 基础上修改。首
37、先在 CMyView 类中重载虚函数 OnPrepareDC() 。在 CMyView 类 的声明中增加一行: virtual void OnPrepareDC(CDC *pDC, CPrintInfo *pInfo=NULL); 然后添加该函数的定义,设置映射模式为 MM_LOMETRIC: / 设置映射模式 void CMyView:OnPrepareDC(CDC *pDC, CPrintInfo *pInfo) pDC-SetMapMode(MM_LOMETRIC); CView:OnPrepareDC(pDC, pInfo); 然后修改消息映射函数 OnLButtonDown(), 将
38、物理坐标转换为逻辑坐标: / 响应点击鼠标左键消息 void CMyView:OnLButtonDown(UINT nFlags, CPoint point) CMyDoc* pDoc = GetDocument(); / 取文档指针 ASSERT_VALID(pDoc); CClientDC dc(this); / 设置设备环境 OnPrepareDC( int r = rand()%50+5; / 生成泡泡 CRect rect(point.x-r, point.y-r, point.x+r, point.y+r); InvalidateRect(rect, FALSE); / 更新视图
39、dc.DPtoLP(rect); / 转换物理坐标为逻辑坐标 pDoc-AddBubble(rect); / 修改文档数据 pDoc-SetModifiedFlag(); / 设置修改标志 7-20 声明一个 Person 类,并使之支持序列化。 程 序: class CPerson: public CObject DECLARE_SERIAL( CPerson) LONG m_IDnumber; / 身份证号码 CString m_strName; / 姓名 CString m_strNation; / 民族 int m_nSex; / 性别 int m_nAge; / 年龄 BOOL m_
40、bMarried; / 婚否 public: CEmployee(); CPerson void Serialize(CArchive ; IMPLEMENT_SERIAL( CPerson, CObject, 1 ) CPerson m_strName = person.m_strName; m_strNation = person.m_strNation; m_nSex = person.m_nSex; m_nAge = person.m_nAge; m_bMarried = person.m_bMarried; return *this; void CPerson:Serialize(C
41、Archive / 首先调用基类的 Serialize()方法 if(ar.IsStoring() ar m_IDnumber; ar m_strName; ar m_strNation; ar m_nSex; ar m_nAge; ar (int)m_bMarried; 7-21 修改例 13-3 的吹泡泡程序,使其打印每个泡泡的数据值。打印格式为每页 40 行,页 眉为文档名,页脚为页号。 说 明:首先为视图类添加一个数据成员 m_nLinePerPage,用来存放每页行数,并在视图 类 CMyView 的构造函数中将 m_nLinePerPage 初始化为 40。 修改视图类成员函数 O
42、nPrepareDC() ,设置映射模式为 MM_TWIPS。该模式为每英寸 1440 点,很适合打印机输出。 程 序: 重载视图类的成员函数 OnPreparePrinting() ,在其中添加计算打印页数的代码: BOOL CMyView:OnPreparePrinting(CPrintInfo* pInfo) CMyDoc *pDoc = GetDocument(); int nPageCount = pDoc-GetListSize()/m_nLinePerPage; if(pDoc-GetListSize() % m_nLinePerPage) nPageCount +; pInfo
43、-SetMaxPage(nPageCount); return DoPreparePrinting(pInfo); 最后重载视图类的 OnPrint()函数并添加打印代码: void CMyView:OnPrint( CDC* pDC, CPrintInfo* pInfo ) int nPage = pInfo-m_nCurPage; / 当前页号 int nStart = (nPage-1)*m_nLinePerPage; / 本页第一行 int nEnd = nStart+m_nLinePerPage; / 本页最后一行 CFont font; / 设置字体 font.CreateFont
44、(-280, 0, 0, 0, 400, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_MODERN, “Courier New“); CFont *pOldFont = (CFont *)(pDC-SelectObject( CRect rectPaper = pInfo-m_rectDraw; / 取页面打印矩形 / 页眉: 页面顶端中央打印文档名称 CMyDoc *pDoc = GetDocument(); ASSERT_V
45、ALID(pDoc); CString str; str.Format(“Bubble Report: %s“, (LPCSTR)pDoc-GetTitle(); CSize sizeText = pDC-GetTextExtent(str); CPoint point(rectPaper.Width()-sizeText.cx)/2, 0); pDC-TextOut(point.x, point.y, str); point.x = rectPaper.left; / 打印页眉下划线 point.y = rectPaper.top-sizeText.cy; pDC-MoveTo(point)
46、; point.x = rectPaper.right; pDC-LineTo(point); / 打印表头 str.Format(“%6.6s %6.6s %6.6s %6.6s %6.6s“, “Index“, “Left“, “Top“, “Right“, “Bottom“); point.x = 720; point.y -= 720; pDC-TextOut(point.x, point.y, str); TEXTMETRIC tm; / 取当前字体有关信息 pDC-GetTextMetrics( int nHeight = tm.tmHeight+tm.tmExternalLead
47、ing; point.y -= 360; / 下移 1/4 英寸 for(int i=nStart; i= pDoc-GetListSize() break; str.Format(“%6d %6d %6d %6d %6d“, i+1, pDoc-GetBubble(i).left, pDoc-GetBubble(i).top, pDoc-GetBubble(i).right, pDoc-GetBubble(i).bottom); point.y -= nHeight; pDC-TextOut(point.x, point.y, str); / 在页面底部中央打印页号 str.Format(“
48、- %d -“, nPage); sizeText = pDC-GetTextExtent(str); point.x = (rectPaper.Width()-sizeText.cx)/2; point.y = rectPaper.Height()+sizeText.cy; pDC-TextOut(point.x, point.y, str); / 释放字体对象 pDC-SelectObject(pOldFont); 7-22 修改例 11-4 的拼图程序,使之在难度菜单的相应选项前打钩。 程 序: 首先在框架窗口类的消息响应函数声明处增加以下消息响应函数的声明: afx_msg void CPuzzleWnd:OnUpdateGrad01(CCmdUI* pCmdUI); afx_msg void CPuzzleWnd:OnUpdateGrad02(CCmdUI* pCmdUI); afx_msg void CPuzzleWnd:OnUpdateGrad03(CCmdUI* pCmdUI); 然后在框架窗口类的消息映射宏中加入相应内容: BEGIN_MESSAGE_MAP(CPuzzleWnd, CFrameWnd) ON_WM_LBUTTO