WEB开发网
开发学院软件开发VC MFC教程(5)-- MFC对象的创建(2) 阅读

MFC教程(5)-- MFC对象的创建(2)

 2010-03-25 20:33:44 来源:WEB开发网   
核心提示:MDI子窗口、视、文档的创建和SDI应用程序类似,MDI应用程序通过文档模板来动态创建MDI子窗口、视、文档对象,MFC教程(5)-- MFC对象的创建(2)(9),不同之处在于:这里使用了多文档模板,调用的是CMDIChildWnd(或派生类)的消息处理函数和虚拟函数,只是它仅用于MDI子窗口的创建上,用来保存创建M

MDI子窗口、视、文档的创建

和SDI应用程序类似,MDI应用程序通过文档模板来动态创建MDI子窗口、视、文档对象。不同之处在于:这里使用了多文档模板,调用的是CMDIChildWnd(或派生类)的消息处理函数和虚拟函数,如果它覆盖了CFrameWnd的有关函数的话。

还是以处理标准命令消息ID_FILE_NEW的OnFileNew为例。

表示OnFileNew的图5-5、表示OnFileOpen的图5-6在多文档应用程序中仍然适用,但表示OpenDocumentFile的图5-8有所不同,其第三步中地单文档模板应当换成多文档模板,关于这一点,参阅图5-8的说明。

(1)多文档模板的OpenDocumentFile

MDI的OpenDocumentFile的原型如下:

CDocument* CMultiDocTemplate::OpenDocumentFile(

LPCTSTR lpszPathName, BOOL bMakeVisible);

它的原型和单文档模板的该函数原型一样,但处理流程比图5-8要简单些:

第一,不用检查是否已经打开了文档;

第二,不用判断是否需要创建框架窗口或者文档对象,因为不论新建还是打开文档都需要创建新的文档框架窗口(MDI子窗口)和文档对象。

除了这两点,其他处理步骤基本相同,调用同样名字的函数来创建文档对象和MDI子窗口。虽然是名字相同的函数,但是参数的值可能有异,又由于C++的虚拟机制和MFC消息映射机制,这些函数可能来自不同层次类的成员函数,因而导致有不同的处理过程和结果,即SDI创建了CFrameWnd类型的对象和边框窗口;MDI则创建了CMDIChildWnd类型的对象和边框窗口。不同之处解释如下:

(2)CMDIChildWnd的虚拟函数LoadFrame

CMDIChildWnd::LoadFrame代替了图5-8中的CFrameWnd::LoadFrame,两者流程大致相同,可以参见图5-11。但是它们用来创建窗口的函数不同。前者调用了函数CMDIChildWnd::Create(参数1…参数6);后者调用了CFrameWnd::Create(参数1…参数7)。

这两个窗口创建函数,虽然都是虚拟函数,但是有很多不同之处:

前者是CMDIChildWnd定义的虚拟函数,后者是CWnd定义的虚拟函数;

前者在参数中指定了父窗口,即主创建窗口,后者的父窗口参数为NULL;

前者指定了WS_CHILD风格,创建的是子窗口,后者创建一个顶层窗口;

前者给客户窗口m_hWndMDIClient(CMDIFrameWnd的成员变量)发送WM_MDICREATE消息让客户窗口来创建MDI子窗口(主边框窗口的子窗口是客户窗口,客户窗口的子窗口是MDI子窗口),后者调用::CreateEx函数来创建边框窗口;

前者的窗口创建数据是指向MDICREATESTRUCT结构的指针,该结构的最后一个域存放一个指向CCreateContext结构的指针,后者是指向CCreateContext结构的指针。

MDICREATESTRUCT结构的定义如下:

typedef struct tagMDICREATESTRUCT { // mdic

LPCTSTR szClass;

LPCTSTR szTitle;

HANDLE hOwner;

int x;

int y;

int cx;

int cy;

DWORD style;

LPARAM lParam;

}MDICREATESTRUCT;

该结构的用处和CREATESTRUCT类似,只是它仅用于MDI子窗口的创建上,用来保存创建MDI子窗口时的窗口创建数据。域lParam保存一个指向CCreateContext结构的指针。

上一页  4 5 6 7 8 9 10  下一页

Tags:MFC 教程 MFC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接