SDI程序三元组的产生(VC2005)

本文详细介绍了在VC2005环境下SDI程序三元组(CView、CDocument、CFrameWnd)的创建过程。从CSingleDocTemplate的实例化到文档与视图的创建,以及窗口类注册等步骤进行了深入剖析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SDI程序三元组的产生(VC2005)


theApp如何构造保存CWinApp指针就跳过了。从pThread->InitInstance()开始.
CWinApp成员m_pDocManager(CDocManager*)用m_templateList (CPtrList)管理CDocTemplate指针列表。而派生自CDocTemplate类的CSingleDocTemplate拥有应用程序的三元组CView、CDocumnet、CFrameWnd派生类的” 名片”(CRuntimeClass指针)。
应用程序的三元组,在InitInstance中被加入。
CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMFCDoc), RUNTIME_CLASS(CMainFrame), // 主SDI 框架窗口 RUNTIME_CLASS(CMFCView)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate);//加入了CDocManager中theApp与三元组关联一块了!

接着,下面语句引发窗口的注册与创建。
调用过程是:


ProcessShellCommandAfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL)
void CWinApp::OnFileNew()
void CDocManager::OnFileNew()
CDocument* CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,BOOL bMakeVisible)


这个函数内创建了文档对象与窗口:


pDocument = CreateNewDocument();
pFrame = CreateNewFrame(pDocument, NULL);


着重介绍CreateNewFrame,其中调用 CFrameWnd::LoadFrame,它利用VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));注册了一个默认窗口类叫"AfxFrameOrView80ud",但面后觉得窗口类名字不满意,可能是怕重名吧,又调用GetIconWndClass改了一个名字,期间调用PreCreateWindow为获得上面注册的默认窗口类类名。GetIconWndClass基本上负责改名,窗口类的其它属性还是默认的。现在好了,有了系统默认的窗口类属性又有了自己的窗口类类名,那创建窗口吧!
调用BOOL CFrameWnd::Create。在此期间又调用了一次PreCreateWindow为给用户一个机会修改窗口显示属性.

CFrame对象窗口一创建引发WM_CREATEWINODW消息导致了下面的调用:


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
int CFrameWnd::OnCreate(LPCREATESTRUCT lpcs)
int CFrameWnd::OnCreateHelper(LPCREATESTRUCT lpcs, CCreateContext* pContext)
CWnd* CFrameWnd::CreateView(CCreateContext* pContext, UINT nID)
if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0,0,0,0), this, nID, pContext))


CView窗口也产生了.至于状态栏与工具栏窗口的创建就不多说了.
最后是消息循环.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值