MFC是如何创建窗口的?
我看了一本书,说是从下边这个步骤建立窗口,我不太明白,请高手讲解:CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSin...
我看了一本书,说是从下边这个步骤建立窗口,我不太明白,请高手讲解:
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CPro2Doc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CPro2View));
AddDocTemplate(pDocTemplate);
请讲的详细些,我查了VC++6.0里面的CRuntimeClass结构体,和宏DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE定义,可是还是不明白?难道是用static变量、函数的特性。
请高手分析下,最好能细点。非非非常常常感谢!
抱歉,因为我问的问题是在太多了,分数只剩下一分了,以后一定补偿。。谢谢。。 展开
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CPro2Doc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CPro2View));
AddDocTemplate(pDocTemplate);
请讲的详细些,我查了VC++6.0里面的CRuntimeClass结构体,和宏DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE定义,可是还是不明白?难道是用static变量、函数的特性。
请高手分析下,最好能细点。非非非常常常感谢!
抱歉,因为我问的问题是在太多了,分数只剩下一分了,以后一定补偿。。谢谢。。 展开
展开全部
文档/视图应用程序中的类和可视化特性都是由一个文档模板类组织起来进行管理的,单文档使用的文档模板类CSingleDocTemplate类的一个实例在CSDICoinApp::InitInstance函数中生成并使用。
BOOL CSDICoinApp::InitInstance()
{ ……
CSingleDocTemplate* pDocTemplate;
pDocTemplate=new CSingleDocTemplate(IDR_MAINFRAME,
RUNTIME_CLASS(CSDICoinDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CSDICoinView));
AddDocTemplate(pDocTemplate);
CSingleDocTemplate对象被创建,传入4个参数,参数1为资源ID IDR_MAINFRAME,标识了4个独立的资源:应用程序图标、菜单、工具栏、加速键表。剩余3个参数都只指向运行时刻(runtime)的类信息的指针,分别是文档类、框架类、视图类。宏RUMTIME_CLASS用于生成这些指针,AppWizard通过引入宏DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE,包含对动态创建这些类的支持
文档、框架、视图对象本身并不在此时创建,以上只是根据装入资源和分配文档、视图及框架类所必须的信息,来初始化CSingleDocTemplate对象,文档模板就是通常所说的类工厂
文档模板类是类工厂的一个实例,类工厂是一个用来定义如何实例化其他类的一个类,知道如何生成应用程序中指定的类
文档模板本身保存在应用程序类中,通过对AddDocTemplate的调用,在CWinApp类中注册新建立的文档模板对象
CWinApp类保留CSingleDocTemplate的对象,直到将自身销毁,CWinApp类自动清理分配给文档模板的全部内存空间
CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName)
{ if(m_pOnlyDoc!=NULL)
pDocument->SaveModified();
else
{ pDocument=CreateNewDocument();
pFrame=CreateNewFrame(pDocument);
}
pDocument->OnNewDocument();
InitialUpdateFrame(pFrame,pDocument);
}
打开文件则是在定义一个文件后,路径和名称被传递给CSingleDocTemplate类的OpenDocumentFile函数,如果传入空值,创建一个新文档
CWinApp::OnFileNew马上调用CDocManager::OnFileNew函数,在得到一个指向前面创建的CSingleDocTemplate对象的指针,使用这个模板指针,可以调用OpenDocumentFile函数
一个SDI的文档对象仅被创建一次(当OpenDocumentFile第一次被调用时),响应”新建”、”打开”命令时,调用的函数重新初始化打开的文档,以便重用。重新初始化发生在SaveModified中,首先检查文档的更改状态,CDocument类有一个BOOL变量用来标识文档是否被修改过
如果文档被修改过,继续下一步操作之前,会提示用户或保存,或继续但不保存,或取消调用
CreateNewDocument创建文档对象,使用运行时的模板类信息,向当前文档列表加入新文档,框架和视图被CreateNewFrame创建
创建对象后,CFrameWnd::LoadFrame调用,传入模板构造器中指定的资源ID,LoadFrame装入每一个资源(菜单、工具栏、图标、加速键表、字符串),将他们附着在框架窗口中,如果任何一种装载失败,LoadFrame生成一条跟踪信息:CDocTemplate couldn’t create a frame。文档通过OnNewDocument完成初始化
InitialUpdateFrame将新建立的视图激活,向包含视图窗口的框架窗口的子窗口,发送消息WM_INITIALUPDATE
以上都是精华,你要仔细琢磨,
BOOL CSDICoinApp::InitInstance()
{ ……
CSingleDocTemplate* pDocTemplate;
pDocTemplate=new CSingleDocTemplate(IDR_MAINFRAME,
RUNTIME_CLASS(CSDICoinDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CSDICoinView));
AddDocTemplate(pDocTemplate);
CSingleDocTemplate对象被创建,传入4个参数,参数1为资源ID IDR_MAINFRAME,标识了4个独立的资源:应用程序图标、菜单、工具栏、加速键表。剩余3个参数都只指向运行时刻(runtime)的类信息的指针,分别是文档类、框架类、视图类。宏RUMTIME_CLASS用于生成这些指针,AppWizard通过引入宏DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE,包含对动态创建这些类的支持
文档、框架、视图对象本身并不在此时创建,以上只是根据装入资源和分配文档、视图及框架类所必须的信息,来初始化CSingleDocTemplate对象,文档模板就是通常所说的类工厂
文档模板类是类工厂的一个实例,类工厂是一个用来定义如何实例化其他类的一个类,知道如何生成应用程序中指定的类
文档模板本身保存在应用程序类中,通过对AddDocTemplate的调用,在CWinApp类中注册新建立的文档模板对象
CWinApp类保留CSingleDocTemplate的对象,直到将自身销毁,CWinApp类自动清理分配给文档模板的全部内存空间
CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName)
{ if(m_pOnlyDoc!=NULL)
pDocument->SaveModified();
else
{ pDocument=CreateNewDocument();
pFrame=CreateNewFrame(pDocument);
}
pDocument->OnNewDocument();
InitialUpdateFrame(pFrame,pDocument);
}
打开文件则是在定义一个文件后,路径和名称被传递给CSingleDocTemplate类的OpenDocumentFile函数,如果传入空值,创建一个新文档
CWinApp::OnFileNew马上调用CDocManager::OnFileNew函数,在得到一个指向前面创建的CSingleDocTemplate对象的指针,使用这个模板指针,可以调用OpenDocumentFile函数
一个SDI的文档对象仅被创建一次(当OpenDocumentFile第一次被调用时),响应”新建”、”打开”命令时,调用的函数重新初始化打开的文档,以便重用。重新初始化发生在SaveModified中,首先检查文档的更改状态,CDocument类有一个BOOL变量用来标识文档是否被修改过
如果文档被修改过,继续下一步操作之前,会提示用户或保存,或继续但不保存,或取消调用
CreateNewDocument创建文档对象,使用运行时的模板类信息,向当前文档列表加入新文档,框架和视图被CreateNewFrame创建
创建对象后,CFrameWnd::LoadFrame调用,传入模板构造器中指定的资源ID,LoadFrame装入每一个资源(菜单、工具栏、图标、加速键表、字符串),将他们附着在框架窗口中,如果任何一种装载失败,LoadFrame生成一条跟踪信息:CDocTemplate couldn’t create a frame。文档通过OnNewDocument完成初始化
InitialUpdateFrame将新建立的视图激活,向包含视图窗口的框架窗口的子窗口,发送消息WM_INITIALUPDATE
以上都是精华,你要仔细琢磨,
展开全部
你那书说的不准确吧,我也被他说晕了。。
我想他的意思是这样的,你参考下:
模板(template)在MFC里面 的作用是联系文档、视图和框架的,你列出的代码就是这个意思。MFC里面有个概念叫做:RTTI(运行时类型信息),它就是张记录了你程序里面用到的每个类的来龙去脉的信息,其父子是谁,由谁而来,经谁而去,也就是一张关系网,你列出的代码,就是把你在该具体程序中用到的CPro2Doc、CMainFrame和pDocTemplate放到这张网中,那么以后有消息响应之类的事情,程序就知道沿着哪条线路去调用了。当然,放入关系网的具体的代码还要借助DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE两个宏定义来实现
我想他的意思是这样的,你参考下:
模板(template)在MFC里面 的作用是联系文档、视图和框架的,你列出的代码就是这个意思。MFC里面有个概念叫做:RTTI(运行时类型信息),它就是张记录了你程序里面用到的每个类的来龙去脉的信息,其父子是谁,由谁而来,经谁而去,也就是一张关系网,你列出的代码,就是把你在该具体程序中用到的CPro2Doc、CMainFrame和pDocTemplate放到这张网中,那么以后有消息响应之类的事情,程序就知道沿着哪条线路去调用了。当然,放入关系网的具体的代码还要借助DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE两个宏定义来实现
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CFSDDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CFSDView));
AddDocTemplate(pDocTemplate);
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
真正建立窗口的是ProcessShellCommand(cmdInfo)函数调用。。可以一步步跟踪。
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CFSDDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CFSDView));
AddDocTemplate(pDocTemplate);
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
真正建立窗口的是ProcessShellCommand(cmdInfo)函数调用。。可以一步步跟踪。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询