mfc ÎĵµÊÓͼ½á¹¹µÄ´´½¨¹ý³Ì(µ¥Îĵµ)
MFCµ¥Îĵµ/ÊÓͼ½á¹¹Çî×·ÃÍ´ò
Ŀ¼
µÚÒ»ÕÂÕÒ»ØWinMainº¯Êý 2
µÚ¶þÕÂInitApplication()º¯Êý 2
µÚÈýÕÂInitInstance ()º¯Êý 3
µÚÒ»½Ú£ºnew CSingleDocTemplate 3
µÚ¶þ½Ú£ºAddDocTemplate(pDocTemplate); 5
µÚÈý½Ú£ºProcessShellCommand(cmdInfo) 5
µÚÒ»¶ÎAfxGetApp()->OnCmdMsg(¡) 6
µÚ¶þ¶ÎOnFileNew(); 6
µÚËÄ½Ú £ºm_pMainWnd->ShowWindow(SW_SHOW); ///ÏÔʾ´°¿Ú 8
µÚÎå½Ú £ºm_pMainWnd-> UpdateWindow (); ///ÖØ»´°¿Ú 8
µÚËÄÕÂpApp->Runº¯Êý 8
µÚÎåÕÂ×ܽá 8
±¾ÎĽ«Õë¶ÔÒ»¸öµ¥ÎĵµÀ´ÃèÊöMFCµÄÎĵµ/ÊÓͼ½á¹¹£¬ËûÖ±½Ó´ò¿ªMFCµÄÔ´´úÂë½øÐзÖÎö£¬ÔÚ·ÖÎö¹ý³ÌÖÐÈ¥µôÁËÎ޹صIJ¿·Ö¡£ËùÒÔµÚÒ»²½¾ÍÊÇÒª´´½¨Ò»¸ö³ÆÎªFirstµÃ¹¤³Ì£¬ÎĵµÀàÐÍÊǵ¥Îĵµ£¬ÏÂÎĽ«Î§ÈÆÕâ¸ö¹¤³ÌÀ´½²µÄ¡£
µÚÒ»ÕÂÕÒ»ØWinMainº¯Êý
Ê×ÏÈÔÚVCµÄ°²×°Â·¾¶ÖÐÕÒµ½WINMAIN.CPPÎļþ£¬AfxWinMainº¯Êý¾ÍÊÇVC±àÒëÆ÷µÄÈë¿Ú£¬È¥µôһЩ²»ÖØÒªµÄ¶«Î÷ºóµÃµ½ÈçϵóÌÐò¡£
int AFXAPI AfxWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow)
{
int nReturnCode = -1;
CWinApp* pApp = AfxGetApp(); ///»ñȡӦÓóÌÐòÀàµÄÖ¸ÕëÓëÎĵµÊÓͼÎ޹ء£
AfxWinInit(hInstance, hPrevInstance,lpCmdLine,nCmdShow); ///ÓëÎĵµÊÓͼÎ޹ء£
pApp->InitApplication(); ///³õʼ»¯Ó¦ÓóÌÐòÏê¼ûÏÂÎÄ¡£
pApp->InitInstance(); ///×îÖØÒªÏÂÃæÏéÊö
nReturnCode = pApp->Run();///ÏûϢѻ·Ö±µ½Ó¦ÓóÌÐò±»¹Ø±Õ¡£ÓëÎĵµÊÓͼÎ޹ء£
AfxWinTerm(); ///ÓëÎĵµÊÓͼÎ޹ء£
return nReturnCode;///Õû¸öÓ¦ÓýáÊø¡£
}
ÏÂÃæ·Ö½Ú½²Êö¡£
µÚ¶þÕÂInitApplication()º¯Êý
ÔÚÎļþAppcore.cppÎļþÖÐInitApplicationÈçÏ£º
BOOL CWinApp::InitApplication()
{
if (CDocManager::pStaticDocManager != NULL) ///Õâ¶ÎºÍÎÒÃǹØÏµ²»´ó,ÔÝʱ²»ÀíËü
{
if (m_pDocManager == NULL)
m_pDocManager = CDocManager::pStaticDocManager;
CDocManager::pStaticDocManager = NULL;
}
if (m_pDocManager != NULL)
m_pDocManager->AddDocTemplate(NULL);
else
CDocManager::bStaticInit = FALSE; /*ÎÒÃǵijÌÐò½«»áÖ´Ðе½Õâ¾ä,±íʾÎĵµÀàÓö¯Ì¬·½Ê½´´½¨,Ò²¾ÍÊÇ˵ÓÃRUNTIME_CLASSÀ´´´½¨µÄ(Ïê¼ûÏÂÎÄ)¡£*/
return TRUE;
}
˵Ã÷£ºCDocManagerÀàÊÇÒ»¸ö²»¹«¿ªµÄÀ࣬ËûÖ÷ÒªÓÃÀ´¹ÜÀí¶àÎĵµÄ£°å¶ÔÏóµÄ£¬¶ÔÓÚµ¥ÎĵµÖ»ÓÐÒ»¸öÎĵµÄ£°åÕâ¸öÀ಻ÊǺÜÖØÒª£¬µ«»¹ÊÇÓÃËü¹ÜÀíÎĵµÄ£°åµÄ£»±¾ÎÄÖ»ÔÚÏà¹ØÖ®´¦×÷˵Ã÷¡£bStaticInitÊÇËüµÄÒ»¸ö¾²Ì¬³ÉÔ±¡£
µÚÈýÕÂInitInstance ()º¯Êý
ËüÒ»°ã±»ÖØÔØ£¬ÔÚFirst¹¤³ÌÖУ¬InitInstanceÖкÍÎĵµÊÓͼÀàÓйصijÌÐòÓÐÏÂÃæµÄһЩ£º
CSingleDocTemplate* pDocTemplate; ///¶¨ÒåÖ¸Õë
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CFirstDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CFirstView)); ///ÕâÌõÓï¾äµÄ×÷ÓüûµÚÒ»¶Î
AddDocTemplate(pDocTemplate);
CCommandLineInfo cmdInfo; ///¶¨ÒåÒ»¸ö¶ÔÏó
ParseCommandLine(cmdInfo); ///½âÎöÃüÁîÐв¢·¢ËͲÎÊý£¬ÓëÎĵµÊÓͼÎÞ¹Ø
if (!ProcessShellCommand(cmdInfo)) ///ÕâÊÇ×îÖØÒªµÄÏê¼ûµÄÈý¶Î
return FALSE;
m_pMainWnd->ShowWindow(SW_SHOW); ///ÏÔʾ´°¿Ú
m_pMainWnd->UpdateWindow();
µÚÒ»½Ú£ºnew CSingleDocTemplate
new CSingleDocTemplateÆäʵ¾ÍÊÇ´´½¨Ò»¸öCSingleDocTemplate¶ÔÏó²¢µ÷ÓÃËûµÄ¹¹Ô캯Êý£¬Òª½²Çå³þÕâ¾ä»°£¬Ê×ÏȱØÐëÃ÷°×RUNTIME_CLASS½á¹¹£¬RUNTIME_CLASS½á¹¹¶¨ÒåÈçÏ£º
#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))
ÓÚÊÇÕâ¾ä»°Õ¹¿ªºóÈçÏÂ(¹ØÓÚ·ûºÏ##µÄ¾ßÌåÒâÒå²Î¼ûMSDN)£º
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
(CRuntimeClass*)(&CFirstDoc::classCFirstDoc),
(CRuntimeClass*)(&CMainFrame::classCMainFrame),
(CRuntimeClass*)(&CFirstView::classCFirstView));
ÕâʱÎÒÃǻᷢÏÖCfirstDoc£¬CmainFrame£¬CfirstView¸÷»á¶àð³öÒ»¸ö¾²Ì¬³ÉÔ±³öÀ´£¬Ëü¾¿¾¹ÔÚÄÄÀïÄØ£¿²é¿´ÕâÈý¸öÀàµÄ¶¨ÒåÎÒÃǻᷢÏÖÿ¸öÀඨÒå¶¼ÓÐÒ»¸öºêDECLARE_DYNCREATE£¬ÔÚʵÏÖÎļþÖÐÓÐÁíÍâÒ»¸öºêIMPLEMENT_DYNCREATE¡£ÏÂÃæ°ÑÕâЩºêµÄÕ¹¿ªÇé¿öÁгöÈçÏ£º
£¨1£©ÎĵµÀà
DECLARE_DYNCREATE(CFirstDoc) Õ¹¿ªºóΪ£º
public:
static const CRuntimeClass classCFirstDoc; ///Õâ¾ÍÊÇÉÏÃæËù˵µÄÄǸö¾²Ì¬³ÉÔ±
virtual CRuntimeClass* GetRuntimeClass() const;
static CObject* PASCAL CreateObject();
IMPLEMENT_DYNCREATE(CFirstDoc, CDocument) Õ¹¿ªºóΪ£º
CObject* PASCAL CFirstDoc::CreateObject()
{ return new CFirstDoc; }
const CRuntimeClass CFirstDoc::classCFirstDoc= {
"CFirstDoc", sizeof(class CFirstDoc), 0xFFFF, CFirstDoc::CreateObject, (CRu
ntimeClass*)(&CDocument::classCDocument), NULL };
CRuntimeClass* CFirstDoc::GetRuntimeClass() const
{ return (CRuntimeClass*)(&CFirstDoc::classCFirstDoc); }
£¨2£©ÊÓͼÀà
DECLARE_DYNCREATE(CFirstView) Õ¹¿ªºóΪ£º
public:
static const CRuntimeClass classCFirstView;
virtual CRuntimeClass* GetRuntimeClass() const;
static CObject* PASCAL CreateObject();
IMPLEMENT_DYNCREATE(CFirstView, CView) Õ¹¿ªºóΪ£º
CObject* PASCAL CFirstView::CreateObject()
{ return new CFirstView; }
const CRuntimeClass CFirstView::classCFirstView = {
" CFirstView ", sizeof(class CFirstView), 0xFFFF, CFirstView::CreateObject, (CRu
ntimeClass*)(&CView::classCView), NULL };
CRuntimeClass* CFirstView::GetRuntimeClass() const
{ return (CRuntimeClass*)(& CFirstView::classCFirstView); }
£¨3£©Ö÷¿ò¼ÜÀà
DECLARE_DYNCREATE(CMainFrame) Õ¹¿ªºóΪ£º
public:
static const CRuntimeClass classCMainFrame;
virtual CRuntimeClass* GetRuntimeClass() const;
static CObject* PASCAL CreateObject();
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) Õ¹¿ªºóΪ£º
CObject* PASCAL CMainFrame::CreateObject()
{ return new CMainFrame; }
const CRuntimeClass CMainFrame::classCMainFrame = {
"CMainFrame", sizeof(class CMainFrame), 0xFFFF, CMainFrame::CreateObject, (CRu
ntimeClass*)(& CFrameWnd::classCFrameWnd), NULL };
CRuntimeClass* CMainFrame::GetRuntimeClass() const
{ return (CRuntimeClass*)(&CMainFrame::classCMainFrame); }
ÕâЩºêÊ×ÏÈÔÚÄãµÄ¶¨ÒåÎļþÖж¨ÒåÒ»¸öÒÔclass+ÀàÃûΪÃû×ֵľ²Ì¬±äÁ¿¡£È»ºó¶¨ÒåÒ»¸ö·µ»ØÕâ¸ö¾²Ì¬±äÁ¿µÄº¯ÊýGetRuntimeClass²¢ÔÚʵÏÖÎļþÖÐʵÏÖÖ®¡£×îºó¶¨Ò岢ʵÏÖÒ»¸ö´´½¨¶ÔÏóµÄº¯ÊýCreateObject¡£
ºÃÁË£¬ÎÒÃÇÏÖÔÚ¾ÍÀ´¿´¿´CSingleDocTemplate¶ÔÏóµÄ¹¹Ô캯Êý×öÁËЩʲô£ºÏÂÃæÊÇËûµÄʵÏÖ
CSingleDocTemplate::CSingleDocTemplate(UINT nIDResource,
CRuntimeClass* pDocClass, CRuntimeClass* pFrameClass,
CRuntimeClass* pViewClass)
: CDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
{
m_pOnlyDoc = NULL;
}
ËüÖ÷ÒªÊdzõʼ»¯ËûµÄ¸¸ÀàCDocTemplate,CDocTemplate×öÁËЩʲô£¿ÈçÏ£º
{
<1>°Ñ×ÊÔ´ID¼°Îĵµ¡¢¿ò¼Ü¡¢ÊÓͼµÄÈý¸öCRuntimeClass½á¹¹µÄ¾²Ì¬³ÉÔ±µÄµØÖ·(Ò²¾ÍÊÇ´«½øÀ´µÄËĸö²ÎÊý) ±£´æÁËÆðÀ´¡£
<2>LoadTemplate();///Ϊָ¶¨µÄÎĵµÄ£°å¶ÔÏó×°ÔØ×ÊÔ´
}
ÖÁ´ËÕâ¸önewÓï¾ä×ÜËã½²ÍêÁË¡£
µÚ¶þ½Ú£ºAddDocTemplate(pDocTemplate);
ÏÂÃæÊÇËûµÄʵÏÖº¯Êý
void CWinApp::AddDocTemplate(CDocTemplate* pTemplate)
{
if (m_pDocManager == NULL)
m_pDocManager = new CDocManager; /*´´½¨Ò»¸öÎĵµ¹ÜÀíÀ࣬¶ÔÓÚµ¥Îĵµ³£³£Ö»ÓÐÒ»¸öÎĵµÄ£°åÓÃCDocManagerÀಢ²»ÊǺÜÖØÒª,ÎÒÃÇ¿ÉÒÔºöÂÔÕâ¾ä*/
m_pDocManager->AddDocTemplate(pTemplate); /*°ÑÎĵµÄ£°åÖ¸Õë±£´æÔÚCDocManagerʵÀýÖÐÓÉCDocManagerÈ¥¹ÜÀíËû,ÎÒÃÇÖ»ÒªÖªµÀÓÐÕâ¸öʾÍÐÐÁË*/
}
µÚÈý½Ú£ºProcessShellCommand(cmdInfo)
Õâ¸öº¯Êý·¢Ë͵ÄÒ»¸öÃüÁî¾ÍÊÇFileNewÆäËûµÄÔÝʱ²»¹ÜËû£¬ÆäʵËùÓеÄÎĵµÀ࣬¿ò¼ÜÀ࣬ÊÓͼÀà¶¼ÊÇÔÚÕâ¸öº¯ÊýÖд´½¨µÄ£¬ÔÚµÚÒ»¶ÎÖÐÒѾ½²µ½Ó¦ÓóÌÐòÀཫÉÏÈý¸öÀàµÄCRuntimeClassÒ»¸ö¾²Ì¬³ÉÔ±µØÖ·±£´æÆðÀ´ÁË£¬¹ØÓÚCRuntimeClass½á¹¹µÄ¾ßÌ幦ÄܲÎÕÕMSDN¡£
ProcessShellCommandÃèÊöÈçÏÂ:
BOOL CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo)
{
BOOL bResult = TRUE;
switch (rCmdInfo.m_nShellCommand)
{
case CCommandLineInfo::FileNew:
if (!AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL))
OnFileNew();
if (m_pMainWnd == NULL)
bResult = FALSE;
break;
case CCommandLineInfo::FileOpen:
if (!OpenDocumentFile(rCmdInfo.m_strFileName))
bResult = FALSE;
break;
¡¡¡¡¡¡¡¡¡¡¡¡.///»¹ÓкܶàÏûÏ¢´¦ÀíÂÔÈ¥
}
return bResult;
}
µÚÒ»¶ÎAfxGetApp()->OnCmdMsg(¡)
AfxGetApp()->OnCmdMsgÖ÷ÒªÊÇÅÉ·¢ÃüÁîÏûÏ¢£¬¸úÎÒÃǹØÏµ×î´óµÄÏûÏ¢ÊDz˵¥ÃüÁîID_FILE_NEW£¬ÏÂÃæ½²ÊöËûµÄ´¦Àíº¯ÊýOnFileNew
µÚ¶þ¶ÎOnFileNew();
OnFileNewÖ»ÊǼòµ¥µÄµ÷ÓÃÎĵµ¹ÜÀí¶ÔÏóµÄͬÃûº¯Êý,ËûµÄÃèÊöÈçÏ£º
void CWinApp::OnFileNew()
{
if (m_pDocManager != NULL)
m_pDocManager->OnFileNew();///Ö»Êǵ÷ÓÃCDocManager::OnFileNew
}
Îĵµ¹ÜÀíÀàµÄOnFileNewÈ¥µôһЩûÓõĶ«Î÷ºóʵÏÖÈçÏ£º
void CDocManager::OnFileNew()
{
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();/*»ñµÃµÚÒ»¸öÎĵµÄ£°å,¶ÔÓÚµ¥ÎĵµÖ»ÓÐÒ»¸öÎĵµÄ£°å*/
if (m_templateList.GetCount() > 1)///¶Ôµ¥ÎĵµÕâ¶ÎûÓÃ
{
CNewTypeDlg dlg(&m_templateList);
int nID = dlg.DoModal();
if (nID == IDOK)
pTemplate = dlg.m_pSelectedTemplate;
else
return; /// none - cancel operation
}
pTemplate->OpenDocumentFile(NULL);/*ÆäʵÊǵ÷ÓÃCSingleDocTemplate::OpenDocumentFileº¯ÊýÏÂÃæÏéÊöÕâÀï,ÒòΪÔÚCDocTemplate ÀàÖÐÕâ¸öº¯ÊýÊÇÒ»¸ö´¿Ð麯Êý*/
}
ÏÂÃæ¼òÊöpTemplate->OpenDocumentFile(NULL);Õâ¸öº¯Êý£¬
ÕâÊÇ×îÖØÒªµÄÒ»¸öº¯Êý,ËûÖ´ÐÐÁËÈçÏÂ6¸ö²½Ö裺
<1>pDocument = CreateNewDocument();///´´½¨Ò»¸öÐÂÎĵµ
{
CDocument* pDocument = (CDocument*)m_pDocClass->CreateObject();/*ÕâÊDzÅÕæÕýµÄ´´½¨Îĵµ¶ÔÏó£¬ÕâÀï´´½¨µÄÎĵµ¶ÔÏó¾ÍÊÇÉÏÃæRUNTIME_CLASS(CFirstDoc),ÖеĶÔÏóÕâÊÇMFC¿ª·¢ÈËÔ±Ïë³öÀ´µÄÒ»ÖÖÔËÐÐʱ´´½¨¶ÔÏóµÄ·½·¨£¬Ó¦¸Ã˵±È½Ï²»´íµÄ,²»ÖªµÀC++BuilderµÄÊÇÔõÑù¹¹ÔìµÄ¡£*/
AddDocument(pDocument); ///°Ñ´´½¨µÄ¶ÔÏóÖ¸Õë¼Ç¼ÏÂÀ´£¬ÒÔºó»¹ÒªÓõġ£
}
<2> pFrame = CreateNewFrame(pDocument, NULL); /*¸ù¾ÝÐÂÎĵµÖ¸Õë´´½¨ÐÂÎĵµ¿ò¼Ü,Õâ¸ö±È½ÏÖØÒªÏÂÒ»¶ÎÃèÊö*/
<3>SetDefaultTitle(pDocument); ///ÉèÖÃȱʡ±êÌ⣬²»ÖØÒªµÄ
<4>pDocument->OnNewDocument() ///Çå³ýÀÏÎĵµÄÚÈÝ
{
DeleteContents(); ///ɾ³ýÔÀ´µÄÄÚÈݶø²»¹ÜÊÇ·ñ´æÅÌ
SetModifiedFlag(FALSE); ///Çå³ýÔø¾Ð޸ĹýµÄ±ê¼Ç
}
<5>pThread->m_pMainWnd = pFrame; ///¿ò¼Ü´°¿Ú×÷ΪµÄÖ¸Õë×÷ΪÖ÷´°¿ÚµÄÖ¸Õë
<.6>InitialUpdateFrame(pFrame, pDocument, bMakeVisible); /*ʹ¿ò¼ÜÖеÄÊÓͼ´°¿Ú½ÓÊܵ½OnInitialUpdatµÄµ÷ÓÃ,²¢×÷Ôʼ¸üС£*/
ÖÁ´ËµÚÒ»¶ÎµÄOnFileNewº¯Êý×ÜËã½²Íê¡£ÏÂÃæ½²<2> CreateNewFrameº¯Êý
CreateNewFrameÊÇCDocTemplateµÄ³ÉÔ±º¯ÊýÈçÏÂ3¸ö²½Ö裺
<2.1>CCreateContext context; ///´´½¨CcreateContext¶ÔÏó.Ò²¾ÍÊÇÎÒÃÇÖØÔØLoadFrameº¯ÊýµÄÄǸöCcreateContextµÄÀ´Ô´*/
context.m_pCurrentFrame = pOther; ///±£´æµ±Ç°¿ò¼Ü£¬Ò»°ãΪNULL
context.m_pCurrentDoc = pDoc; ///±£´æÎĵµ¶ÔÏóÖ¸Õë
context.m_pNewViewClass = m_pViewClass; ///±£´æÊÓͼ¶ÔÏóÖ¸Õë
context.m_pNewDocTemplate = this; ///±£´æÎĵµÄ£°åµÄÖ¸Õë¡£
<2.2>CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject(); ///ÕæÕý´´½¨¿ò¼ÜµÄ¶ÔÏó
<2.3>pFrame->LoadFrame(m_nIDResource,WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
NULL, &context) ///¼ÓÔØ×ÊÔ´£¬ÕâÊÇ×îÖØÒªµÄ£¬ÏÂÃæ½²Êö
{
<2.3.1> GetIconWndClass(dwDefaultStyle, nIDResource) ///¼ÓÔØ×ÊÔ´²¢×¢²á´°¿Ú
{
AfxFindResourceHandle
::LoadIcon ///¼ÓÔØ¹â±ê×ÊÔ´
CREATESTRUCT cs; ///´´½¨Ò»¸öCREATESTRUCT½á¹¹ÊµÀý
PreCreateWindow(cs); /*µ÷Óô°¿ÚÔ¤´´½¨º¯Êý£¬Õâ¸öº¯ÊýÎÒÃÇ¿ÉÒÔÖØÔØµÄ
¸ù¾Ýcsµ÷Óà AfxRegisterWndClass×¢²á¿ò¼Ü´°¿Ú*/
}
<2.3.2> Create(¡) ///´´½¨¿ò¼Ü´°¿Ú,ºóÃæÏéÊö£¬´Ë´¦ÔÝʱ²»½²¡£
<2.3.3> m_hMenuDefault = ::GetMenu(m_hWnd); ///»ñÈ¡²¢±£´æ²Ëµ¥¾ä±ú
<2.3.4> LoadAccelTable(MAKEINTRESOURCE(nIDResource)); ///×°ÔØ¼ÓËÙ¼ü±í
}
ÏÂÃæ½²Createº¯Êý£¬ÈçÏÂ4¸ö²½Ö裺
<2.3.2.1>hMenu = ::LoadMenu(hInst, lpszMenuName); ///¼ÓÔØ²Ëµ¥
<2.3.2.2>CREATESTRUCT cs; ///´´½¨Ò»¸öCREATESTRUCT½á¹¹ÊµÀý
cs.lpCreateParams = lpParam; ///(´ËʱµÄlpParam¾ÍÊÇ<2.1>½¨µÄcontext¶ÔÏóÖ¸Õë)
<2.3.2.3> PreCreateWindow(cs); ///µ÷Óô°¿ÚÔ¤´´½¨º¯Êý£¬Õâ¸öº¯ÊýÎÒÃÇ¿ÉÒÔÖØÔØµÄ,ÓÖµ÷ÓÃÒ»´Î
<2.3.2.4>µ÷ÓÃAPIº¯Êý::CreateWindowExÕæÕý´´½¨¿ò¼Ü´°¿Ú£¬´´½¨¹ý³ÌÖлᷢ³öWM_CREATEºÍWM_NCCREATEµÈÏûÏ¢¡£
ÏÂÃæ½²½ÓÊÕWM_CREATEÏûÏ¢µÄÏûÏ¢´¦Àíº¯ÊýCMainFrame::OnCreate£¬ÆäËûÏûÏ¢²»ÖØÒª
<2.3.2.3.1>CMainFrame::OnCreate×îÖØÒªµÄÊǵ÷ÓÃCFrameWnd::OnCreateHelperº¯ÊýÈçÏÂ:
{
<1>CWnd::OnCreate(lpcs); ///µ÷ÓÃȱʡµÄ
<2>µ÷ÓÿÉÖØÔØº¯ÊýOnCreateClient(lpcs,pContext)º¯Êý, ÔÚOnCreateClientº¯ÊýÄÚÖ»Êǵ÷ÓÃCreateView(pContext, AFX_IDW_PANE_FIRST)º¯Êý;
CreateViewº¯Êý²½ÖèÈçÏ£º
{
<2.1> pView=pContext->m_pNewViewClass->CreateObject(); /*´´½¨ÊÓͼ¶ÔÏó*/
<2.2>pView->Create(¡);/*µ÷ÓÃÊÓͼ¶ÔÏóµÄCreateº¯ÊýÕæÕý´´½¨ÊÓͼ,Æä¸üÏêϸµÄ¶¯×÷¿ÉÒÔ²»ÀíËû£¬µ«ÒªÖªµÀÕâÀï»á·¢ÉúºÜ¶àÊÂÇé(¸ú´´½¨¿ò¼Ü´°¿ÚÀàËÆµÄ)£»ÆäËûһЩ²»ÖØÒªµÄ¶¯×÷¿ÉÒÔ²»ÀíËû£»*/
}
<3>PostMessage(WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE);/*·¢Ò»¸öWM_SETMESSAGESTRINGÏûÏ¢³õʼ»¯ÏûÏ¢´®*/
<4>RecalcLayout(); ///ÖØ¶¨¿ØÖÆÀ¸µÈÎ޹ض¯×÷
}
<2.3.2.3.2> m_wndToolBar.CreateEx; ///´´½¨¹¤¾ßÀ¸
<2.3.2.3.3> LoadToolBar; /Í£¿¿¹¤¾ßÀ¸µÈÎ޹ض¯×÷
ÖÁ´ËWM_CREATEÏûÏ¢´¦Àí½²Í꣬ͬʱµÚÈý¶ÎµÄProcessShellCommandº¯ÊýÒ²½áÊøÁË
µÚËÄ½Ú £ºm_pMainWnd->ShowWindow(SW_SHOW); ///ÏÔʾ´°¿Ú
µÚÎå½Ú £ºm_pMainWnd-> UpdateWindow (); ///ÖØ»´°¿Ú
ÖÁ´ËµÚ¶þ½ÚInitInstance ()º¯Êý½²Íê,
µÚËÄÕÂpApp->Runº¯Êý
Runº¯Êý´¦ÀíÏûϢѻ·Ö±µ½³ÌÐòÍÆ³ö£¬ÒѾÓкܶàÊé¼®½²µ½ËûµÄ¹ý³Ì£¬±¾ÎIJ»ÃèÊöËû¡£
µÚÎåÕÂ×ܽá
´ÓÉÏÃæµÄÃèÊöÖпÉÒÔ¿´³ö£¬Îĵµ/ÊÓͼ½á¹¹µÄ¹Ø¼üÔÚCRuntimeClass½á¹¹£¬Í¨¹ýCRuntimeClass½á¹¹ÊµÏÖ¶¯Ì¬´´½¨¶ÔÏó¡£
ÂÞÀïÂÞིÁËÕâô¶à£¬Ï£Íû¶ÔѧMFCµÄÈËÃÇ»áÓаïÖú£¬µ±È»ÉÏÃæµÄÃèÊöÖп϶¨»áÓдíÎóµÄµØ·½ºÍ²»×ãÖ®´¦£¬Ï£ÍûÔĶÁÕßÖ¸³ö£¬Ö»ÓÐÕâÑù²ÅÄÜ´ïµ½¹²Í¬½ø²½µÄÄ¿µÄ¡£