MFC视图结构框架分析20页word文档.docx
- 文档编号:26818826
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:24
- 大小:25.62KB
MFC视图结构框架分析20页word文档.docx
《MFC视图结构框架分析20页word文档.docx》由会员分享,可在线阅读,更多相关《MFC视图结构框架分析20页word文档.docx(24页珍藏版)》请在冰豆网上搜索。
MFC视图结构框架分析20页word文档
MFC文档视图结构框架分析
“教书先生”恐怕是市井百姓最为熟悉的一种称呼,从最初的门馆、私塾到晚清的学堂,“教书先生”那一行当怎么说也算是让国人景仰甚或敬畏的一种社会职业。
只是更早的“先生”概念并非源于教书,最初出现的“先生”一词也并非有传授知识那般的含义。
《孟子》中的“先生何为出此言也?
”;《论语》中的“有酒食,先生馔”;《国策》中的“先生坐,何至于此?
”等等,均指“先生”为父兄或有学问、有德行的长辈。
其实《国策》中本身就有“先生长者,有德之称”的说法。
可见“先生”之原意非真正的“教师”之意,倒是与当今“先生”的称呼更接近。
看来,“先生”之本源含义在于礼貌和尊称,并非具学问者的专称。
称“老师”为“先生”的记载,首见于《礼记?
曲礼》,有“从于先生,不越礼而与人言”,其中之“先生”意为“年长、资深之传授知识者”,与教师、老师之意基本一致。
1:
程序的“导火索”---theApp
“师”之概念,大体是从先秦时期的“师长、师傅、先生”而来。
其中“师傅”更早则意指春秋时国君的老师。
《说文解字》中有注曰:
“师教人以道者之称也”。
“师”之含义,现在泛指从事教育工作或是传授知识技术也或是某方面有特长值得学习者。
“老师”的原意并非由“老”而形容“师”。
“老”在旧语义中也是一种尊称,隐喻年长且学识渊博者。
“老”“师”连用最初见于《史记》,有“荀卿最为老师”之说法。
慢慢“老师”之说也不再有年龄的限制,老少皆可适用。
只是司马迁笔下的“老师”当然不是今日意义上的“教师”,其只是“老”和“师”的复合构词,所表达的含义多指对知识渊博者的一种尊称,虽能从其身上学以“道”,但其不一定是知识的传播者。
今天看来,“教师”的必要条件不光是拥有知识,更重于传播知识。
CmyApptheApp;
教师范读的是阅读教学中不可缺少的部分,我常采用范读,让幼儿学习、模仿。
如领读,我读一句,让幼儿读一句,边读边记;第二通读,我大声读,我大声读,幼儿小声读,边学边仿;第三赏读,我借用录好配朗读磁带,一边放录音,一边幼儿反复倾听,在反复倾听中体验、品味。
在声明对象的同时,调用其构造函数。
按C++的语法,首先要调用其基类Cwinapp的构造函数.这个文件主要用于应用程序的一些初始化操作。
classCWinApp:
publicCWinThread
DECLARE_DYNAMIC(CWinApp)
public:
//Constructor
CWinApp(LPCTSTRlpszAppName=NULL);
CWinApp:
:
CWinApp(LPCTSTRlpszAppName)
if(lpszAppName!
=NULL)
m_pszAppName=_tcsdup(lpszAppName);
else
m_pszAppName=NULL;
//initializeCWinThreadstate
AFX_MODULE_STATE*pModuleState=_AFX_CMDTARGET_GETSTATE();
AFX_MODULE_THREAD_STATE*pThreadState=pModuleState->m_thread;
ASSERT(AfxGetThread()==NULL);
pThreadState->m_pCurrentWinThread=this;
ASSERT(AfxGetThread()==this);
m_hThread=:
:
GetCurrentThread();
m_nThreadID=:
:
GetCurrentThreadId();
//initializeCWinAppstate
ASSERT(afxCurrentWinApp==NULL);//onlyoneCWinAppobjectplease
pModuleState->m_pCurrentWinApp=this;
ASSERT(AfxGetApp()==this);
//innon-runningstateuntilWinMain
m_hInstance=NULL;
m_hLangResourceDLL=NULL;
m_pszHelpFilePath=NULL;
m_pszProfileName=NULL;
m_pszRegistryKey=NULL;
m_pszExeName=NULL;
m_pRecentFileList=NULL;
m_pDocManager=NULL;
m_atomApp=m_atomSystemTopic=NULL;
m_lpCmdLine=NULL;
m_pCmdInfo=NULL;
//initializewaitcursorstate
m_nWaitCursorCount=0;
m_hcurWaitCursorRestore=NULL;
//initializecurrentprinterstate
m_hDevMode=NULL;
m_hDevNames=NULL;
m_nNumPreviewPages=0; //notspecified(defaultsto1)
//initializeDAOstate
m_lpfnDaoTerm=NULL; //willbesetifAfxDaoInitcalled
//otherinitialization
m_bHelpMode=FALSE;
m_eHelpType=afxWinHelp;
m_nSafetyPoolSize=512; //defaultsize
2:
theApp之后的隐藏代码,由他控制整个程序的流程。
_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
LPTSTRlpCmdLine,intnCmdShow)
//callshared/exportedWinMain
returnAfxWinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow);
其中有宏定义:
#define_tWinMain wWinMain
intAFXAPIAfxWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
LPTSTRlpCmdLine,intnCmdShow)
ASSERT(hPrevInstance==NULL);
intnReturnCode=-1;
CWinThread*pThread=AfxGetThread();;//CWinApp是从CWinThread派生的,
CWinApp*pApp=AfxGetApp(); //实质上就是pThread==pApp
//AFXinternalinitialization
if(!
AfxWinInit(hInstance,hPrevInstance,lpCmdLine,nCmdShow)) //用于初始化
gotoInitFailure;
//Appglobalinitializations(rare)
if(pApp!
=NULL&&!
pApp->InitApplication()) //用于初始化
gotoInitFailure;
//Performspecificinitializations
if(!
pThread->InitInstance()) //注意多态性 virtualBOOLInitInstance();
//又因为pThread==pApp,所以调用pApp->InitInstance()
if(pThread->m_pMainWnd!
=NULL)
TRACE(traceAppMsg,0,"Warning:
Destroyingnon-NULLm_pMainWnd\n");
pThread->m_pMainWnd->DestroyWindow();
nReturnCode=pThread->ExitInstance();
gotoInitFailure;
nReturnCode=pThread->Run(); //控制消息循环
InitFailure:
#ifdef_DEBUG
//CheckformissingAfxLockTempMapcalls
if(AfxGetModuleThreadState()->m_nTempMapLock!
=0)
TRACE(traceAppMsg,0,"Warning:
Tempmaplockcountnon-zero(%ld).\n",
AfxGetModuleThreadState()->m_nTempMapLock);
AfxLockTempMaps();
AfxUnlockTempMaps(-1);
#endif
AfxWinTerm();
returnnReturnCode;
由上面的程序可以看到几个很重要的函数
(1)AfxWinInit(hInstance,hPrevInstance,lpCmdLine,nCmdShow))
gotoInitFailure;
(2)pApp->InitApplication())
(3)pThread->InitInstance()
(4)pThread->Run()
其中1,2也是完成程序的一些初始化工作,4主要是为了处理消息,3呢,很关键,我们运行时看到的窗口就是从这里产生。
下面一一介绍
3:
程序自动产生的InitInstance()函数
以下是自动生成的InitInstance()源程序:
BOOLCmyApp:
:
InitInstance()
//如果一个运行在WindowsXP上的应用程序清单指定要
//使用ComCtl32.dll版本6或更高版本来启用可视化方式,
//则需要InitCommonControls()。
否则,将无法创建窗口。
InitCommonControls();
CWinApp:
:
InitInstance();
//初始化OLE库
if(!
AfxOleInit())
AfxMessageBox(IDP_OLE_INIT_FAILED);
returnFALSE;
AfxEnableControlContainer();
//标准初始化
//如果未使用这些功能并希望减小
//最终可执行文件的大小,则应移除下列
//不需要的特定初始化例程
//更改用于存储设置的注册表项
//TODO:
应适当修改该字符串,
//例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
LoadStdProfileSettings(4); //加载标准INI文件选项(包括MRU)
//注册应用程序的文档模板。
文档模板
//将用作文档、框架窗口和视图之间的连接
CMultiDocTemplate*pDocTemplate;
pDocTemplate=newCMultiDocTemplate(IDR_myTYPE,
RUNTIME_CLASS(CmyDoc),
RUNTIME_CLASS(CChildFrame),//自定义MDI子框架
RUNTIME_CLASS(CmyView));
if(!
pDocTemplate)
returnFALSE;
AddDocTemplate(pDocTemplate);
//创建主MDI框架窗口
CMainFrame*pMainFrame=newCMainFrame;
if(!
pMainFrame||!
pMainFrame->LoadFrame(IDR_MAINFRAME))
returnFALSE;
m_pMainWnd=pMainFrame;
//仅当具有后缀时才调用DragAcceptFiles
// 在MDI应用程序中,这应在设置m_pMainWnd之后立即发生
//分析标准外壳命令、DDE、打开文件操作的命令行
CCommandLineInfocmdInfo;
ParseCommandLine(cmdInfo);
//调度在命令行中指定的命令。
如果
//用/RegServer、/Register、/Unregserver或/Unregister启动应用程序,则返回FALSE。
if(!
ProcessShellCommand(cmdInfo)) //引发窗口注册
returnFALSE;
//主窗口已初始化,因此显示它并对其进行更新
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
returnTRUE;
其中,注册窗口用到了一下函数,比较长,如下:
BOOLAFXAPIAfxEndDeferRegisterClass(LONGfToRegister)
//maskoffallclassesthatarealreadyregistered
AFX_MODULE_STATE*pModuleState=AfxGetModuleState();
fToRegister&=~pModuleState->m_fRegisteredClasses;
if(fToRegister==0)
returnTRUE;
LONGfRegisteredClasses=0;
//commoninitialization
WNDCLASSwndcls;
memset(&wndcls,0,sizeof(WNDCLASS)); //startwithNULLdefaults
wndcls.lpfnWndProc=DefWindowProc; //窗口处理函数
wndcls.hInstance=AfxGetInstanceHandle();
wndcls.hCursor=afxData.hcurArrow;
INITCOMMONCONTROLSEXinit;
init.dwSize=sizeof(init);
//worktoregisterclassesasspecifiedbyfToRegister,populatefRegisteredClassesaswego
if(fToRegister&AFX_WND_REG)
//Childwindows-nobrush,noicon,safestdefaultclassstyles
wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
wndcls.lpszClassName=_afxWnd;
if(AfxRegisterClass(&wndcls))
fRegisteredClasses|=AFX_WND_REG;
if(fToRegister&AFX_WNDOLECONTROL_REG)
//OLEControlwindows-useparentDCforspeed
wndcls.style|=CS_PARENTDC|CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
wndcls.lpszClassName=_afxWndOleControl;
if(AfxRegisterClass(&wndcls))
fRegisteredClasses|=AFX_WNDOLECONTROL_REG;
if(fToRegister&AFX_WNDCONTROLBAR_REG)
//Controlbarwindows
wndcls.style=0; //controlbarsdon'thandledoubleclick
wndcls.lpszClassName=_afxWndControlBar;
wndcls.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
if(AfxRegisterClass(&wndcls))
fRegisteredClasses|=AFX_WNDCONTROLBAR_REG;
if(fToRegister&AFX_WNDMDIFRAME_REG)
//MDIFramewindow(alsousedforsplitterwindow)
wndcls.style=CS_DBLCLKS;
wndcls.hbrBackground=NULL;
if(_AfxRegisterWithIcon(&wndcls,_afxWndMDIFrame,AFX_IDI_STD_MDIFRAME))
fRegisteredClasses|=AFX_WNDMDIFRAME_REG;
if(fToRegister&AFX_WNDFRAMEORVIEW_REG)
//SDIFrameorMDIChildwindowsorviews-normalcolors
wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
wndcls.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
if(_AfxRegisterWithIcon(&wndcls,_afxWndFrameOrView,AFX_IDI_STD_FRAME))
fRegisteredClasses|=AFX_WNDFRAMEORVIEW_REG;
if(fToRegister&AFX_WNDCOMMCTLS_REG)
//thisflagiscompatiblewiththeoldInitCommonControls()API
init.dwICC=ICC_WIN95_CLASSES;
fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WIN95CTLS_MASK);
fToRegister&=~AFX_WIN95CTLS_MASK;
if(fToRegister&AFX_WNDCOMMCTL_UPDOWN_REG)
init.dwICC=ICC_UPDOWN_CLASS;
fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_UPDOWN_REG);
if(fToRegister&AFX_WNDCOMMCTL_TREEVIEW_REG)
init.dwICC=ICC_TREEVIEW_CLASSES;
fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_TREEVIEW_REG);
if(fToRegister&AFX_WNDCOMMCTL_TAB_REG)
init.dwICC=ICC_TAB_CLASSES;
fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_TAB_REG);
if(fToRegister&AFX_WNDCOMMCTL_PROGRESS_REG)
init.dwICC=ICC_PROGRESS_CLASS;
fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_PROGRESS_REG);
if(fToRegister&AFX_WNDCOMMCTL_LISTVIEW_REG)
init.dwICC=ICC_LISTVIEW_CLASSES;
fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_LISTVIEW_REG);
if(fToRegister&AFX_WNDCOMMCTL_HOTKEY_REG)
init.dwICC=ICC_HOTKEY_CLASS;
fRegisteredClasses|=_Af
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 视图 结构 框架 分析 20 word 文档