标签:des style class code ext color
程序首先进入文件AppModul.cpp,找到_tWinMain()函数运行,调用其中的AfxWinMain()函数。
由于为了支持UNICODE,C运行库对WinMain其实区分了UNICODE版和ANSI版.对UNICODE版的程序,C运行库将调用wWinMain,而对于ANSI版的应用,则调用WinMain.
MFC的代码设计时是自动支持UNICODE的,所以,MFC的WinMain在APPMODUL.CPP被定义为_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow),无论用户#define _UNICODE与否,MFC的WinMain都会被调用.
1
2
3
4
5
6
7
8 |
extern
"C" int WINAPI _tWinMain( HINSTANCE
hInstance, HINSTANCE
hPrevInstance, _In_ LPTSTR
lpCmdLine, int
nCmdShow) #pragma warning(suppress: 4985) { // call shared/exported WinMain return
AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); } |
hInstance:表示该程序当前运行的实例句柄,它是一个数值。当程序在Windows下运行时,它唯一标识运行中的实例。
hPrevInstance:父窗口句柄。这个参数在Win32下已经不起作用了。
lpCmpLine:指定传递给应用程序的命令行参数。
nCmdShow:指定程序窗口如何显示,例如最大化、最小化、隐藏等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 |
int AFXAPI AfxWinMain( HINSTANCE
hInstance, HINSTANCE
hPrevInstance, _In_ LPTSTR
lpCmdLine, int
nCmdShow) { ASSERT(hPrevInstance == NULL); int
nReturnCode = -1; CWinThread* pThread = AfxGetThread(); //返回指向theApp的指针 CWinApp* pApp = AfxGetApp(); //返回指向theApp的指针 // AFX internal initialization if
(!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow)) //初始化应用程序内部环境,设置MFC goto
InitFailure; // App global initializations (rare) if
(pApp != NULL && !pApp->InitApplication()) //初始化应用程序内部环境,设置MFC goto
InitFailure; // Perform specific initializations if
(!pThread->InitInstance()) //完成应用程序相关工作:设计窗口类、注册窗口类、创建窗口类、显示窗口类、更新窗口类 { if
(pThread->m_pMainWnd != NULL) { TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n" ); 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) { TRACE(traceAppMsg, 0, "Warning: Temp map lock count non-zero (%ld).\n" , AfxGetModuleThreadState()->m_nTempMapLock); } AfxLockTempMaps(); AfxUnlockTempMaps(-1); #endif AfxWinTerm(); return
nReturnCode; } |
这是个虚函数,pThread指向的是theApp,调用的是子类C***App类中的InitInstance函数。
KuaiPaiClient项目中的该函数为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 |
BOOL
CKuaiPanClientApp::InitInstance() { // InitCommonControlsEx() is required on Windows XP if an application // manifest specifies use of ComCtl32.dll version 6 or later to enable // visual styles. Otherwise, any window creation will fail. INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof (InitCtrls); // Set this to include all the common control classes you want to use // in your application. InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinAppEx::InitInstance(); // Initialize OLE libraries if
(!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return
FALSE; } AfxEnableControlContainer(); EnableTaskbarInteraction(FALSE); // AfxInitRichEdit2() is required to use RichEdit control // AfxInitRichEdit2(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need // Change the registry key under which our settings are stored // TODO: You should modify this string to be something appropriate // such as the name of your company or organization SetRegistryKey(_T( "Local AppWizard-Generated Applications" )); LoadStdProfileSettings(4); // Load standard INI file options (including MRU) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 |
InitContextMenuManager(); InitKeyboardManager(); InitTooltipManager(); CMFCToolTipInfo ttParams; ttParams.m_bVislManagerTheme = TRUE; theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL, RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams); // Register the application‘s document templates. Document templates // serve as the connection between documents, frame windows and views CSingleDocTemplate* pDocTemplate; pDocTemplate = new
CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CKuaiPanClientDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CKuaiPanClientView)); if
(!pDocTemplate) return
FALSE; AddDocTemplate(pDocTemplate); //将Doc类、CMainFrame和CView三个类用文档模板关联到一起,装载到当前应用程序的全局对象theApp中。 // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Dispatch commands specified on the command line. Will return FALSE if // app was launched with /RegServer, /Register, /Unregserver or /Unregister. if
(!ProcessShellCommand(cmdInfo)) return
FALSE; // The one and only window has been initialized, so show and update it m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); // call DragAcceptFiles only if there‘s a suffix // In an SDI app, this should occur after ProcessShellCommand return
TRUE; } |
标签:des style class code ext color
原文地址:http://www.cnblogs.com/lucas-hsueh/p/3713563.html