青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

winlinglin

MFC學習筆記(一)

Win32應用程序有條明確的主線:
 (1) 進入WinMain函數
 (2) 設計一個Window
 (3) 注冊這個Window
 (4) 建立這個Window
 (5) 顯示和更新這個Window
 (6) 進入消息循環
 
好,我就先找WinMain函數吧。
我在C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc的appmodul.cpp的23行中找到了以下代碼:
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);
}

_tWinMain是一個宏,詳細為: #define _tWinMain WinMain
所以這個確實是我們要找的WinMain函數

從代碼中看出,WinMain將參數全部交給AfxWinMain,來處理。
好,我又找AfxWinMain這個函數。

我在winmain.cpp的19行找到了AfxWinMain函數。
代碼:
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 _In_ LPTSTR lpCmdLine, int nCmdShow)
{
 ASSERT(hPrevInstance == NULL);   // ASSERT在程序運行時它計算括號內的表達式,如果表達式為FALSE (0),
           // 程序將報告錯誤,并終止執行。如果表達式不為0,則繼續執行后面的語句。
           // ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略。
           // assert()的功能類似,它是ANSI C標準中規定的函數,它與ASSERT的一個重要區別是可以用在Release版本中。
 int nReturnCode = -1;
 // AfxGetThread和 AfxGetApp 都是全局函數
 CWinThread* pThread = AfxGetThread();  // 獲得正在執行的線程,Must be called from within the desired thread.
 CWinApp* pApp = AfxGetApp();    // 獲得A pointer to the single CWinApp object for the application

 // AFX internal initialization
            // This function is called by the MFC-supplied WinMain function, as part of the CWinApp initialization of a GUI-based
            // application, to initialize MFC.
 if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))  
  goto InitFailure;

 // App global initializations (rare)
 if (pApp != NULL && !pApp->InitApplication())  //InitApplication已經過時,用InitInstance代替,完成MFC內部管理方面的工作
  goto InitFailure;

 // Perform specific initializations
 if (!pThread->InitInstance())  // 初始化Instance,在每個 a copy of the program runs的時候,虛函數
 {
  if (pThread->m_pMainWnd != NULL)
  {
   TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n");
   pThread->m_pMainWnd->DestroyWindow();   // m_pMainWnd holds a pointer to the application's main window.返回一個CWnd.
               // cWnd Destroys the attached Windows window.
  }
  nReturnCode = pThread->ExitInstance();    // to exit this instance of the thread
  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;
}


找到了WinMain函數后,看了下MFC為我生成的類:
1. CTestApp  2. CTestView 3. CMainFrame  4. CTestDoc  5. CAboutDlg
查看CTestApp.cpp,發現了一個全局的CTestApp theApp,因為全局對象必須在main函數之前產生并初始化,所以應用程序調用的順序應該是
CTestApp的構造函數 -> WinMain函數
又發現class CTestApp : public CWinApp,子類的構造函數在父類的構造函數調用之后調用,所以就搜索CWinApp吧。

在appcore.cpp的368行發現以下代碼:
CWinApp::CWinApp(LPCTSTR lpszAppName)  // 此處的lpszAppName有個默認參數NULL
{
 if (lpszAppName != NULL)
  m_pszAppName = _tcsdup(lpszAppName); // 為lpszAppName分配內存
 else
  m_pszAppName = NULL;

 // initialize CWinThread state
 AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
 ENSURE(pModuleState);
 AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
 ENSURE(pThreadState);
 ASSERT(AfxGetThread() == NULL);
 pThreadState->m_pCurrentWinThread = this;  // 如果有子類繼承了CWinApp, this就是子類
 ASSERT(AfxGetThread() == this);
 m_hThread = ::GetCurrentThread();
 m_nThreadID = ::GetCurrentThreadId();

 // initialize CWinApp state
 ASSERT(afxCurrentWinApp == NULL); // only one CWinApp object please
 pModuleState->m_pCurrentWinApp = this;   // 如果有子類繼承了CWinApp, this就是子類
 ASSERT(AfxGetApp() == this);

 // in non-running state until WinMain
 m_hInstance = NULL;
 m_hLangResourceDLL = NULL;v
 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;

 // initialize wait cursor state
 m_nWaitCursorCount = 0;
 m_hcurWaitCursorRestore = NULL;

 // initialize current printer state
 m_hDevMode = NULL;
 m_hDevNames = NULL;
 m_nNumPreviewPages = 0;     // not specified (defaults to 1)

 // initialize DAO state
 m_lpfnDaoTerm = NULL;   // will be set if AfxDaoInit called

 // other initialization
 m_bHelpMode = FALSE;
 m_eHelpType = afxWinHelp;
 m_nSafetyPoolSize = 512;        // default size
}

然后是CTestApp的構造函數的調用。
在CTestApp的聲明中,它重寫了InitInstance函數,如下:
BOOL CTestApp::InitInstance()
{
 AfxEnableControlContainer();  //Call this function in your application object's InitInstance function
          //to enable support for containment of ActiveX controls

 // 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.

// In MFC 5.0, Enable3dControls and Enable3dControlsStatic are obsolete because their functionality is incorporated
// into Microsoft's 32-bit and 64-bit operating systems.  
 
#ifdef _AFXDLL
 Enable3dControls();   // Call this when using MFC in a shared DLL
#else
 Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif

 // 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();  // Load standard INI file options (including MRU)

 // 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(CTestDoc),
  RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  RUNTIME_CLASS(CTestView));
 AddDocTemplate(pDocTemplate);

 // Parse command line for standard shell commands, DDE, file open
 CCommandLineInfo cmdInfo;   // 對命令查詢分析
 ParseCommandLine(cmdInfo);

 // Dispatch commands specified on the command line
 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();

 return TRUE;
}


有了WinMain函數,也找到了顯示和更新窗口的語句,但是從哪里開始設計窗口,注冊窗口,建立窗口呢?
我又搜索了WNDCLASS,在wincore.cpp的4495行發現了與設計窗口時很像的函數BOOL AFXAPI AfxEndDeferRegisterClass(LONG fToRegister)
發現MS已經在里面為我注冊了一些窗口,我只要選擇自己想要的樣式就可以了。

那么如何建立一個窗口呢?我又搜索了CreateWindow,在wincore.cpp的675行中有個BOOL CWnd::CreateEx函數。
里面有調用CreateWindowEx。這個函數還調用了一個叫PreCreateWindow的函數,這個函數主要是確定在建立窗口之前,確保要建立的窗口已經注冊了。

好了,一切都準備好了。最后就是進入消息循環。

posted on 2009-03-03 01:24 wil 閱讀(1868) 評論(0)  編輯 收藏 引用

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

導航

統計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

文章分類

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产伦精品一区二区三区视频孕妇 | 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲午夜在线观看视频在线| 亚洲图片在线观看| 免费国产一区二区| 国产精品专区h在线观看| 亚洲电影欧美电影有声小说| 久久久亚洲午夜电影| 亚洲国产婷婷香蕉久久久久久99 | 日韩一级黄色av| 亚洲欧美国产制服动漫| 免费国产自线拍一欧美视频| 亚洲一区二区精品| 午夜精品久久久久久久蜜桃app| 久久九九电影| 国产精品a久久久久| 国产有码一区二区| 亚洲国产一区二区三区a毛片| 亚洲一区二区三区免费在线观看| 在线一区日本视频| 欧美一级欧美一级在线播放| 欧美激情第1页| 午夜视频一区在线观看| 欧美激情精品| 亚洲国产欧美不卡在线观看| 这里只有视频精品| 久久久91精品国产| 亚洲人体大胆视频| 欧美一区精品| 最新国产拍偷乱拍精品| 亚洲国语精品自产拍在线观看| 亚洲婷婷在线| 日韩亚洲欧美精品| 欧美日韩日本网| 亚洲精品中文字幕女同| 免费中文日韩| 亚洲自拍偷拍福利| 国产精品福利片| 亚洲免费一区二区| 尤物yw午夜国产精品视频明星| 亚洲欧美国产视频| 夜夜嗨av一区二区三区网站四季av| 久久五月激情| 国产一区白浆| 久久婷婷丁香| 久久精品论坛| 在线观看精品| 亚洲激情婷婷| 国产精品久久久亚洲一区 | 国产精品另类一区| 亚洲永久免费视频| 午夜在线播放视频欧美| 国产亚洲成年网址在线观看| 久久青草欧美一区二区三区| 欧美成人精品三级在线观看 | 欧美18av| 国一区二区在线观看| 久久久一区二区| 老司机一区二区三区| 欧美日韩国产综合视频在线| 久久综合精品国产一区二区三区| 欧美日韩国产高清视频| 免费亚洲一区| 黄色成人精品网站| 日韩视频免费观看高清完整版| 亚洲国产一区二区三区青草影视| 国产一级久久| 欧美一区免费| 久久久亚洲国产美女国产盗摄| 国产精品女主播一区二区三区| 亚洲国产一二三| 亚洲一区在线直播| 日韩午夜电影| 欧美激情视频一区二区三区在线播放| 亚洲国产午夜| 在线视频国产日韩| 欧美专区福利在线| 亚洲精品免费在线播放| 亚洲欧美国产另类| 亚洲国产福利在线| 中文有码久久| 国产专区综合网| 国产精品久久久久久久久搜平片| 欧美中在线观看| 国产精品99久久久久久白浆小说| 久久久国产精品一区二区三区| 亚洲人成欧美中文字幕| 国产在线精品一区二区中文| 欧美色欧美亚洲另类七区| 久久夜色精品国产噜噜av| 久热综合在线亚洲精品| 久久五月婷婷丁香社区| 亚洲激情av在线| 国产一区二区0| 男人的天堂成人在线| 欧美激情按摩在线| 午夜精品区一区二区三| 欧美精品成人| 亚洲精品永久免费| 亚洲精品免费网站| 欧美一级免费视频| 欧美亚洲综合在线| 国产精品日韩在线| 嫩草国产精品入口| 亚洲精品国产精品久久清纯直播 | 亚洲宅男天堂在线观看无病毒| 99国产精品久久久久久久| 一本色道久久精品| 欧美三级精品| 一区二区三区视频免费在线观看| 午夜亚洲影视| 欧美国产91| 99这里只有精品| 午夜在线观看免费一区| 亚洲深爱激情| 最新成人av网站| 亚洲美女精品久久| 国产一区二区三区成人欧美日韩在线观看 | 99精品99久久久久久宅男| 国产精品久久久久一区二区| 欧美成人激情视频| 国产视频在线观看一区| 日韩视频一区二区| 欧美日韩成人一区| 日韩亚洲在线| 久久激情五月丁香伊人| 激情视频一区二区| 欧美精品亚洲一区二区在线播放| 亚洲精品国产精品国产自| 精品动漫3d一区二区三区免费| 美女91精品| 亚洲一区三区在线观看| 日韩视频一区二区三区| 欧美在线精品一区| 亚洲一区二区三区精品在线 | 亚洲国产成人久久综合一区| 99视频精品| 国产又爽又黄的激情精品视频| 欧美激情一区二区| 美国成人直播| 久久精品日产第一区二区三区| 在线一区二区三区做爰视频网站| 欧美电影免费观看高清完整版| 午夜电影亚洲| 一区二区三区久久久| 亚洲深夜影院| 亚洲高清久久| 久久精品人人做人人爽| 亚洲国产一区二区视频| 国产真实乱偷精品视频免| 久久天天躁夜夜躁狠狠躁2022 | 国产一区二区中文字幕免费看| 欧美理论视频| 国产精品99久久久久久有的能看| 久久精品日韩欧美| 亚洲综合色激情五月| 欧美人体xx| a4yy欧美一区二区三区| 亚洲一二三级电影| 国产欧美一级| 久久亚洲综合色| 91久久在线| 亚洲网站啪啪| 国产精品一区在线播放| 性视频1819p久久| 亚洲视频免费看| 亚洲人成小说网站色在线| 宅男噜噜噜66一区二区| 久久久久综合| 国产一区久久| 亚洲精品日本| 香蕉久久夜色| 亚洲精品三级| 久久国产精品久久久久久久久久 | 久久精品在线免费观看| 久久激情视频| 国产精品v欧美精品v日韩精品| 亚洲精品美女久久7777777| 国外精品视频| 久久精品成人一区二区三区蜜臀| 欧美成人免费在线视频| 亚洲欧美一区二区三区极速播放| 欧美电影免费观看高清完整版| 国产一区二区三区奇米久涩| 亚洲精品免费在线播放| 老鸭窝91久久精品色噜噜导演| 亚洲欧美日韩综合aⅴ视频| 欧美激情一区二区三区成人| 韩国美女久久| 亚洲欧洲一区二区三区久久| 亚洲免费在线观看视频| 国产精品久久久久久久久久尿| 韩国精品在线观看| 一区二区电影免费在线观看| 狠狠色噜噜狠狠色综合久| 午夜精品免费在线| 久久精品视频免费| 亚洲人成在线观看| 久久久久综合一区二区三区| 中文无字幕一区二区三区|