按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
的Views 。
■ CFrameWnd 有一个成员变量CView* m_pViewActive ,指向目前正作用中的
Vie。w
■ CView 有一个成员变量CDocument* m_pDocument,指向相关的Document 。
466
…………………………………………………………Page 529……………………………………………………………
第8章 Document…View 深入探討
CWinApp CDocManager
CDocManager* m_pDocManager; CPtrList m_templateList;
My。RC
IDR_SCRIBBTYPE ICON 〃。。。〃
IDR_SCRIBBTYPE MENU Document Template
{ 。。。 } UINT m_nIDResource; Document Template
STRINGTABLE
BEGIN CRuntimeClass* m_pDocClass;
CRuntimeClass* m_pFrameClass;
IDR_SCRIBBTYPE
“。。。n。。。n 。。。n 。。。n 。。。n 。。。n 。。。” CRuntimeClass* m_pViewClass;
END
CDocument* m_pOnlyDoc;
CObject::classCObject CCmdTarget::classCCmdTargetCThreadApp::classCThreadApp
“CObject” “CCmdTarget” “CWinThread” // in CSingleDocTemplate
4 4 4
or
m_pfnConstruct m_pfnConstruct m_pfnConstruct
m_pNextClass m_pNextClass m_pNextClass CPtrList m_docList;
NULL
CFrameWnd::classCFrameWndCWnd::classCWnd CWinApp::classCWinApp // in CMultiDocTemplate
“CFrameWnd” “CWnd” “CWinApp”
12 4 4
m_pfnConstruct m_pfnConstruct m_pfnConstruct
m_pNextClass m_pNextClass m_pNextClass
CDocument::classCDocumentCView::classCView
“CDocument” “CView”
4 4
m_pfnConstruct m_pfnConstruct
CRuntimeClass::pFirstClass
m_pNextClass m_pNextClass
CRuntimeClass Linked…list
Document
Frame Document
CView* m_pViewActive; CDocTemplate* m_pDocTemplate; disk
CString m_strPathName;
CPtrList m_viewList;
GetActiveDocument()
UpdateAllViews()
CView* pView = GetActiveView();
return pView…》GetDocument();
View
CDocument* m_pDocument; View
GetActiveView()
OnUpdate()
return m_pViewActive;
GetDocument()
return m_pDocument;
GetParentFrame()
图 8…2 CDocTemplate、CDocument、CView 、CFrameWnd 之间 的关系
467
…………………………………………………………Page 530……………………………………………………………
第篇 深入 MFC 程式設計
我把Document/View/Frame 的观念以狂风骤雨之势对你做了一个交待。模糊?晦暗?没
有关系,马上我们就开始实作Scribble Step1,你会从实作过程中慢慢体会上述观念。
Scribble Step1 的Document 数据结构设计
Scribble 允许使用者在窗口中画图,画图的方式是以鼠标做为画笔,按下左键拖曳拉出
线条。每次按下鼠标左键后一直到放开为止的连续坐标点构成线条(stroke )。整张图(整
份文件)由线条构成,线条可由点、笔宽、笔色等等资料构成(但本例并无笔色资料)。
MFC 的Collections Classes 中有许多适用于各种数据类型(如Byte、Word 、DWord 、Ptr )
以及各种数据结构(如数组、串行)的现成类别。如果我们尽可能把这些现成的类别应
用到程序的数据结构上面,就可以节省许多开发时间:
CObject
CObject
CArray (template) CList (template) CMap (template)
CArray (template) CList (template) CMap (template)
CByteArray CPtrList CMapWordToPtr
CByteArray CMapWordToPtr
CDWordArray CObList CMapPtrToWord
CDWordArray CObList CMapPtrToWord
CObArray CStringList CMapPtrToPtr
CObArray CStringList CMapPtrToPtr
CPtrArray Lists of user types CMapWordToOb
CPtrArray Lists of user types CMapWordToOb
CStringArray CMapStringToPtr
CStringArray Typed Template Collections CMapStringToPtr
CUIntArray CTypedPtrArray CMapStringToOb
CUIntArray CTypedPtrArray CMapStringToOb
CWordArray CTypedPtrList CMapStringToString
CWordArray CTypedPtrList CMapStringToString
Arrays of user types CTypedPtrMap Maps of user types
Arrays of user types CTypedPtrMap Maps of user types
我们的设计最高原则就是尽量使用MFC 已有的类别,提高软件IC 的重复使用性。上
图浅色部份是Scribble 范例程序在16 位MFC 中采用的两个类别。深色部份是
Scribble 范例程序在32 位MFC 中采用的两个类别。
468
…………………………………………………………Page 531……………………………………………………………
第8章 Document…View 深入探討
MFC Collection Classes 的选用
第5章末尾我曾经大致提过MFC Collection Classes 。它们分为三种类型,用来管理一大
群对象:
■ Array :数组,有次序性(需依序处理),可动态增减大小,索引值为整数。
■ List :双向串行,有次序性(需依序处理),无索引。串行有头尾,可从头尾
或从串行的任何位置安插元素,速度极快。
■ Map :又称为Dictionary ,其内对象成对存在,一为键值对象(key object ),
一为实值对象(value object )。
下面是其特性整理:
类型 有序 索引