按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
Message Map 的一部份,ClassWizard 可以很方便地帮助我们完成相关的Message Map 设
定工作。
首先,选按【View/ClassWizard 】激活ClassWizard,选择其【Message Map 】附页:
在图右上侧的【Class Name 】清单中选择CScribbleView,然后在图左侧的【Object IDs 】
清单中选择CScribbleView,再在图右侧的【Messages 】清单中选择WM_LBUTTONDOWN ,
然后选按图右的【Add Function 】钮,于是图下侧的【Member functions 】清单中出现一
笔新项目。
然后,选按【Edit Code 】钮,文字编辑器会跳出来,你获得了一个OnLButtonDown 函数
空壳,请在这里键入你的程序代码:
496
…………………………………………………………Page 559……………………………………………………………
第8章 Document…View 深入探討
另两个消息处理例程的实作作法雷同。
Message Map 因此有什么变化呢?ClassWizard 为我们自动加上了三笔映射项目:
BEGIN_MESSAGE_MAP(CScribbleView; CView)
//{{AFX_MSG_MAP(CScribbleView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
// Standard printing mands
ON_MAND(ID_FILE_PRINT; CView::OnFilePrint)
ON_MAND(ID_FILE_PRINT_DIRECT; CView::OnFilePrint)
ON_MAND(ID_FILE_PRINT_PREVIEW; CView::OnFilePrintPreview)
END_MESSAGE_MAP()
此外ScribbleView 的类别声明中也自动有了三个成员函数的声明:
class CScribbleView : public CView
{
。。。
// Generated message map functions
protected:
//{{AFX_MSG(CScribbleView)
afx_msg void OnLButtonDown(UINT nFlags; CPoint point);
afx_msg void OnLButtonUp(UINT nFlags; CPoint point);
afx_msg void OnMouseMove(UINT nFlags; CPoint point);
//}}AFX_MSG
。。。
};
497
…………………………………………………………Page 560……………………………………………………………
第篇 深入 MFC 程式設計
WizardBar 的辅佐
WizardBar 是Visual C++ 4。0 之后的新增工具,也就是文字编辑器上方那个有着【Object
IDs 】和【Messages 】清单的横杆。关于修改Message Map 这件事,WizardBar 可以取代
ClassWizard 这个大家伙。
首先,进入ScribbleViwe。cpp (因为我们确定要在这里加入三个鼠标消息处理例程),选
择WizardBar 上的【Object IDs 】为CScribbleView , 再选择【Messages 】为
_
WM LBUTTONDOWN ,出现以下画面:
回答Yes ,于是你获得一个OnLButtonDown 函数空壳,一如在ClassWizard 中所得。请
在函数空壳中输入你的程序代码。
Serialize :对象的文件读写
你可能对Serialization 这个名词感觉陌生,事实上它就是对象导向世界里的Persistence (永
续生存),只是后者比较抽象一些。对象必须能够永续生存,也就是它们必须能够在程
式结束时储存到文件中,并且在程序重新激活时再恢复回来。储存和恢复对象的过程在
MFC 之中就称为serialization。负责这件重要任务的,是MFC CObject 类别中一个名为
Serialize 的虚拟函数,文件的「读」「写」动作均透过它。
498
…………………………………………………………Page 561……………………………………………………………
第8章 Document…View 深入探討
如果文件内容是借着层层类别向下管理(一如本例),那么只要每一层把自己份内的工
作做好,层层交待下来就可以完成整份资料的文件动作。
Serialization 以外的文件读写动作
其实有时候我们希望在重重包装之中返璞归真一下,感受一些质朴的动作。在介绍
Serialization 的重重包装之前,这里给你一览文件实际读写动作的机会。
文件I/O 服务是任何操作系统的主要服务。Win32 提供了许多文件相关APIs :开档、
关文件、读文件、写文件、搜寻资料。。。。MFC 把这些操作都包装在CFile 之中。可想而知,它
必然有Open、Close、Read 、Write、Seek 。。。 等等成员函数。下面这段程序代码示范CFile 如
何读档:
char* pBuffer = new char'0x8000';
CFile file(〃mydoc。doc〃; CFile::modeRead); //
打开mydoc。doc 文件,使用只读模式。
UINT nBytesRead = file。Read(pBuffer; 0x8000); // 读取8000h 个字节到pBuffer 中。
上述程序片段中,对象file 的构造式将打开mydoc。doc 档。并且由于此对象产生于函数
的堆栈之中,当函数结束,file 的析构式将自动关闭mydoc。doc 档。
开文件模式有许多种,都定义在CFile (AFX。H )之中:
enum OpenFlags {
modeRead = 0x0000; //只读
modeWrite = 0x0001; // 唯写
modeReadWrite =0x0002; // 可读可写
sharepat = 0x0000;
shareExclusive = 0x0010; // 唯我使用
shareDenyWrite = 0x0020;
shareDenyRead =0x0030;
shareDenyNone =0x0040;
modeNoInherit =0x0080;
modeCreate = 0x1000; //产生新档(甚至即使已有相同名称之文件存在)
modeNoTruncate = 0x2000;
typeText = 0x4000; // typeText and typeBinary are used in
typeBinary = (int)0x8000 // derived classes only
};
typeText = 0x4000; // typeText and typeBinary are used in
typeBinary = (int)0x8000 // derived classes only
};
499
…………………………………………………………Page 562……………………………………………………………
第篇 深入 MFC 程式設計
再举一例,下面这段程序代码可将文件mydoc。doc 的所有文字转换为小写:
char* pBuffer = new char'0x1000';
CFile file(〃mydoc。doc〃; CFile::modeReadWrite);
DWORD dwBytesRemaining = f