已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 MFC的运行步骤:(这是对于文档视图结构的应用程序的)theApp(theApp()-/应用程序全局对象的构造和内存分配WinMain()-/进入主函数AfxWinMain()-/调用APIInitAplacation()(应用程序的内部管理)-/用于应用程序的内部管理的初始化Initinstance()(theApp)-/初始化应用程序对象应用程序的Initinstance()-/应用程序的初始化(创建和注册窗口类、显示和更新应用程序框架)注册窗口类-AfxEndDeferRegisterClass ()(该函数根据不同的应用程序注册不同的窗口类)-AfxRegisterClass()-CMainFrame:PreCreateWindow()-CFrameWnd:PreCreateWindow()-AfxDeferRegisterClass()(如果没有注册,就注册窗口类;它实际上是AfxEndRegisterClass()的宏)(一般都是在这里注册窗口类,由于文档窗口涉及到文档视图类的管理)-LoadFrame()-/载入框架CFrameWnd:Create()-/CWnd:CreateEx()-/创建应用程序窗口CMainFrame:PreCreateWindow()(实际上该函数是一个虚函数,也就是说如果子类为应用程序定义了该函数,那么它将调用子类的函数,因此,我们可以重载该函数来修改应用程序框架的外观)-/在框架窗口显示之前调用ShowWindow()-UpdateWindow()-/显示和更新 消息循环:- CwinThread:Run()-do-while()循环(-PumpMessage()-GetMessage()-TranslateMessage()-DispatchMessage()简单的说就是初始化全局对象进入主函数再进行窗口类的创建和注册并显示,然后进入消息循环。theApp:全局变量或是类对象在程序运行前初始化。即分配内存空间,初始成员。(每一个MFC应用程序都只有一个全局对象theApp对象,我们用该全局对象唯一的表示该应用程序。)下面我们给出这些函数如何跟踪(我的是装在C:盘下的他们都在。MFCSRC下)WinMain()函数(C:Program FilesMicrosoft Visual StudioVC98MFCSRCAPPMODUL.CPP)WinApp(C:Program FilesMicrosoft Visual StudioVC98MFCSRCTHRDCORE.CPP)AfxWinMain()(C:Program FilesMicrosoft Visual StudioVC98MFCSRCWINMAIN.CPP)int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) ASSERT(hPrevInstance = NULL); int nReturnCode = -1; CWinThread* pThread = AfxGetThread(); CWinApp* pApp = AfxGetApp(); / AFX internal initialization if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow) goto InitFailure; / App global initializations (rare) if (pApp != NULL & !pApp-InitApplication() / C:Program FilesMicrosoft Visual StudioVC98MFCincludeAFXWIN.H) goto InitFailure; / Perform specific initializations if (!pThread-InitInstance() / C:Program FilesMicrosoft Visual StudioVC98MFCincludeAFXWIN.H) if (pThread-m_pMainWnd != NULL) TRACE0(Warning: Destroying non-NULL m_pMainWndn); pThread-m_pMainWnd-DestroyWindow(); nReturnCode = pThread-ExitInstance(); goto InitFailure; nReturnCode = pThread-Run();InitFailure:#ifdef _DEBUG / Check for missing AfxLockTempMap calls if (AfxGetModuleThreadState()-m_nTempMapLock != 0) TRACE1(Warning: Temp map lock count non-zero (%ld).n, AfxGetModuleThreadState()-m_nTempMapLock); AfxLockTempMaps(); AfxUnlockTempMaps(-1);#endif AfxWinTerm(); return nReturnCode;AfxEndDeferRegisterClass #define AfxDeferRegisterClass(fClass) AfxEndDeferRegisterClass(fClass)BOOL AFXAPI AfxEndDeferRegisterClass(LONG fToRegister) / mask off all classes that are already registered AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); fToRegister &= pModuleState-m_fRegisteredClasses; if (fToRegister = 0) return TRUE; LONG fRegisteredClasses = 0; / common initialization WNDCLASS wndcls; memset(&wndcls, 0, sizeof(WNDCLASS); / start with NULL defaults wndcls.lpfnWndProc = DefWindowProc; wndcls.hInstance = AfxGetInstanceHandle(); wndcls.hCursor = afxData.hcurArrow; INITCOMMONCONTROLSEX init; init.dwSize = sizeof(init);/各种各样的窗口类的注册 / work to register classes as specified by fToRegister, populate fRegisteredClasses as we go if (fToRegister & AFX_WND_REG) / Child windows - no brush, no icon, safest default class styles wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; wndcls.lpszClassName = _afxWnd; if (AfxRegisterClass(&wndcls) fRegisteredClasses |= AFX_WND_REG; if (fToRegister & AFX_WNDOLECONTROL_REG) / OLE Control windows - use parent DC for speed 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) / Control bar windows wndcls.style = 0; / control bars dont handle double click wndcls.lpszClassName = _afxWndControlBar; wndcls.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); if (AfxRegisterClass(&wndcls) fRegisteredClasses |= AFX_WNDCONTROLBAR_REG; if (fToRegister & AFX_WNDMDIFRAME_REG) / MDI Frame window (also used for splitter window) wndcls.style = CS_DBLCLKS; wndcls.hbrBackground = NULL; if (_AfxRegisterWithIcon(&wndcls, _afxWndMDIFrame, AFX_IDI_STD_MDIFRAME) fRegisteredClasses |= AFX_WNDMDIFRAME_REG; if (fToRegister & AFX_WNDFRAMEORVIEW_REG) / SDI Frame or MDI Child windows or views - normal colors 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) / this flag is compatible with the old InitCommonControls() 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 |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_HOTKEY_REG); if (fToRegister & AFX_WNDCOMMCTL_BAR_REG) init.dwICC = ICC_BAR_CLASSES; fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_BAR_REG); if (fToRegister & AFX_WNDCOMMCTL_ANIMATE_REG) init.dwICC = ICC_ANIMATE_CLASS; fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_ANIMATE_REG); if (fToRegister & AFX_WNDCOMMCTL_INTERNET_REG) init.dwICC = ICC_INTERNET_CLASSES; fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_INTERNET_REG); if (fToRegister & AFX_WNDCOMMCTL_COOL_REG) init.dwICC = ICC_COOL_CLASSES; fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_COOL_REG); if (fToRegister & AFX_WNDCOMMCTL_USEREX_REG) init.dwICC = ICC_USEREX_CLASSES; fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_USEREX_REG); if (fToRegister & AFX_WNDCOMMCTL_DATE_REG) init.dwICC = ICC_DATE_CLASSES; fRegisteredClasses |= _AfxInitCommonControls(&init, AFX_WNDCOMMCTL_DATE_REG); / save new state of registered controls pModuleState-m_fRegisteredClasses |= fRegisteredClasses; / special case for all common controls registered, turn on AFX_WNDCOMMCTLS_REG if (pModuleState-m_fRegisteredClasses & AFX_WIN95CTLS_MASK) = AFX_WIN95CTLS_MASK) pModuleState-m_fRegisteredClasses |= AFX_WNDCOMMCTLS_REG; fRegisteredClasses |= AFX_WNDCOMMCTLS_REG; / must have registered at least as mamy classes as requested return (fToRegister & fRegisteredClasses) = fToRegister;BOOL CFrameWnd:LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext) / only do this once ASSERT_VALID_IDR(nIDResource); ASSERT(m_nIDHelp = 0 | m_nIDHelp = nIDResource); m_nIDHelp = nIDResource; / ID for help context (+HID_BASE_RESOURCE) CString strFullString; if (strFullString.LoadString(nIDResource) AfxExtractSubString(m_strTitle, strFullString, 0); / first sub-string VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG); / attempt to create the window LPCTSTR lpszClass = GetIconWndClass(dwDefaultStyle, nIDResource); LPCTSTR lpszTitle = m_strTitle; if (!Create(lpszClass, lpszTitle, dwDefaultStyle, rectDefault, pParentWnd, MAKEINTRESOURCE(nIDResource), 0L, pContext) return FALSE; / will self destruct on failure normally / save the default menu handle ASSERT(m_hWnd != NULL); m_hMenuDefault = :GetMenu(m_hWnd); / load accelerator resource LoadAccelTable(MAKEINTRESOURCE(nIDResource); if (pContext = NULL) / send initial update SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE); return TRUE;CWnd:CreateEx()virtual BOOL CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam = NULL );virtual BOOL CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, LPVOID lpParam = NULL);CMainFrame:PreCreateWindow()virtual BOOL PreCreateWindow( CREATESTRUCT& cs );typedef struct tagCREATESTRUCT LPVOID lpCreateParams; HANDLE hInstance; HMENU hMenu; HWND hwndParent; int cy; int cx; int y; int x; LONG style; LPCSTR lpszName; LPCSTR lpszClass; DWORD dwExStyle; CREATESTRUCT;CwinThread:Run()int CWinApp:Run() if (m_pMainWnd = NULL & AfxOleGetUserCtrl() / Not launc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江苏住院医师规范化培训考试(心胸外科II阶段)题库历年参考题库含答案详解
- 2026正高面审答辩-正高006面审答辩内分泌学历年题库含答案详解
- 2026文物保护工程从业资格考试(责任设计师·古文化遗址古墓葬)历年参考题库含答案详解
- 2026教师职称-山西-山西教师职称(基础知识、综合素质、小学美术)历年参考题库含答案详解3套试卷
- 沉降课程设计
- 北京美术教培课程设计
- 城市轨道信号课程设计
- 送料装置纺织设计工艺课程设计
- 谣言传播风险评估方法课程设计
- 内容营销技师考试试卷及答案
- 2026盐城市国企招聘考试真题及答案
- 2026年中国电信校园招聘考试笔试试题及答案
- (2026)事业单位招聘考试《公共基础知识》真题库参考答案
- 2026秋人教版(新教材)小学数学五年级上册(全册)教学设计(附目录p273)
- 苏州工业园区娄葑街道2026年社工招聘考试【结构化面试题库+高分答题模板】(含考官评分要点)
- 2026人教版五年级上语文课后生字情境默写小纸条
- 高三英语第一轮复习教学计划
- 第25章 一元二次方程数学活动 教学设计
- 2026嘉兴市市级机关事业单位编外招聘24人笔试参考试题及答案详解
- 2026年河大版(新教材)初中信息技术七年级全一册《常见的互联网应用》教学课件
- 三沙市2025海南三沙市考核招聘船长1人笔试历年参考题库典型考点附带答案详解
评论
0/150
提交评论