本文主要是介绍SDI程序三元组的产生(VC2005),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SDI程序三元组的产生(VC2005)
theApp如何构造保存CWinApp指针就跳过了。从 pThread->InitInstance() 开始.
CWinApp成员m_pDocManager(CDocManager*)用m_templateList (CPtrList)管理CDocTemplate指针列表。而派生自CDocTemplate类的CSingleDocTemplate拥有应用程序的三元组CView、CDocumnet、CFrameWnd派生类的” 名片”(CRuntimeClass指针)。
应用程序的三元组,在InitInstance中被加入。
接着,下面语句引发窗口的注册与创建。
调用过程是:
ProcessShellCommand AfxGetApp()->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窗口也产生了.至于状态栏与工具栏窗口的创建就不多说了.
最后是消息循环.
这篇关于SDI程序三元组的产生(VC2005)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!