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

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 閱讀(1874) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導航

統計

常用鏈接

留言簿(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>
            亚洲精品精选| 牛人盗摄一区二区三区视频| 亚洲国产福利在线| 欧美激情视频在线播放| 亚洲人成啪啪网站| 亚洲国语精品自产拍在线观看| 免费观看成人| 亚洲午夜在线| 欧美亚洲日本网站| 尤物网精品视频| 亚洲黄色免费网站| 国产精品高清免费在线观看| 欧美一级久久久| 久久九九久久九九| 一本色道久久综合精品竹菊| 一本久久a久久精品亚洲| 国产美女一区| 欧美激情免费观看| 欧美色播在线播放| 久久日韩精品| 国产精品成人播放| 久久免费视频网| 欧美 日韩 国产在线| 亚洲一区二区免费| 久久9热精品视频| 夜色激情一区二区| 欧美中文字幕在线播放| 日韩亚洲精品电影| 欧美亚洲日本一区| 亚洲精品一区二区三区在线观看 | 国产精品一区在线播放| 久久婷婷国产麻豆91天堂| 女人天堂亚洲aⅴ在线观看| 亚洲香蕉在线观看| 久久久久国产成人精品亚洲午夜| 日韩视频在线一区| 欧美一级大片在线观看| 9色精品在线| 久久精品一本久久99精品| 亚洲网址在线| 嫩草影视亚洲| 麻豆freexxxx性91精品| 国产精品国产三级国产普通话蜜臀| 免费成人美女女| 国产麻豆成人精品| 亚洲美女区一区| 亚洲人成77777在线观看网| 欧美影院久久久| 中文欧美字幕免费| 免费视频亚洲| 久久综合成人精品亚洲另类欧美| 国产精品高潮视频| 亚洲日本中文字幕| 亚洲精品1区2区| 久久成人免费| 久久久久青草大香线综合精品| 欧美日韩国产麻豆| 亚洲国产精品久久久久婷婷884 | 亚洲高清在线视频| 亚洲欧美区自拍先锋| 99成人免费视频| 嫩模写真一区二区三区三州| 久热精品在线| 激情久久久久久久| 欧美一区二区三区的| 久久久久国产精品人| 国产婷婷色一区二区三区在线| 日韩一区二区精品视频| 亚洲精品国久久99热| 美女主播一区| 亚洲国产高潮在线观看| 日韩视频在线你懂得| 欧美人与性动交cc0o| 亚洲精品久久久久| 亚洲亚洲精品在线观看 | 亚洲一区免费网站| 午夜精品av| 国产午夜久久| 久久久免费观看视频| 欧美成人精品不卡视频在线观看 | 欧美人与性动交a欧美精品| 91久久亚洲| 亚洲一区制服诱惑| 国产婷婷色一区二区三区| 久久精品国产在热久久| 美女尤物久久精品| 亚洲另类一区二区| 欧美日韩在线三区| 亚洲女同性videos| 欧美mv日韩mv国产网站| 日韩亚洲国产欧美| 国产精品婷婷| 久久亚洲风情| 亚洲社区在线观看| 麻豆freexxxx性91精品| 99在线热播精品免费99热| 国产精品久久久久久久浪潮网站 | 老司机精品视频网站| 亚洲黄一区二区三区| 亚洲综合二区| 在线看日韩av| 国产精品www994| 久久婷婷丁香| 亚洲一二三区在线| 欧美激情在线免费观看| 午夜精品亚洲| 亚洲人成人99网站| 国产精品网站在线播放| 久久综合九色九九| 中日韩美女免费视频网址在线观看| 欧美怡红院视频| 99精品视频免费观看视频| 国内成人精品2018免费看| 欧美日本韩国| 久久视频这里只有精品| 亚洲综合色婷婷| 亚洲精品无人区| 免费美女久久99| 欧美中在线观看| 亚洲婷婷在线| 亚洲理论在线观看| 亚洲二区免费| 韩国精品一区二区三区| 国产精品久久久久高潮| 欧美精品一区二区三区很污很色的| 欧美在线国产| 午夜视频在线观看一区二区三区 | 美女视频黄a大片欧美| 性欧美xxxx视频在线观看| 一本大道久久a久久精品综合| 永久免费毛片在线播放不卡| 国产精品私拍pans大尺度在线| 欧美人在线观看| 欧美国产精品日韩| 女同性一区二区三区人了人一| 久久久91精品国产| 欧美在线日韩精品| 欧美一区二区三区在线免费观看| 亚洲少妇自拍| 亚洲亚洲精品在线观看| 一本综合精品| 99视频精品免费观看| 日韩一二三区视频| 亚洲日本无吗高清不卡| 亚洲精品一区二区在线| 亚洲毛片一区| 99热这里只有精品8| 亚洲精品专区| av不卡在线看| 亚洲中无吗在线| 午夜精彩视频在线观看不卡| 午夜激情一区| 久久国产视频网站| 久久综合色婷婷| 欧美成人在线网站| 欧美日韩一区在线观看| 国产精品久久久久久久久动漫| 国产精品视频导航| 韩国欧美一区| 亚洲精品一区二区三区av| 99精品欧美一区| 性xx色xx综合久久久xx| 久久久噜久噜久久综合| 欧美阿v一级看视频| 亚洲国产精品99久久久久久久久| 亚洲国产美女久久久久| 日韩视频三区| 午夜久久久久久| 久久一区二区视频| 欧美日本成人| 国产三级精品三级| 亚洲欧洲在线视频| 亚洲专区一区二区三区| 久久九九全国免费精品观看| 欧美成人资源网| 亚洲视频综合在线| 久久久午夜精品| 欧美日韩午夜在线| 黄色在线成人| 亚洲免费综合| 欧美福利精品| 亚洲欧美日韩综合aⅴ视频| 麻豆精品网站| 国产精品美女在线观看| 亚洲福利视频三区| 欧美一级久久| 亚洲激情第一页| 久久精品国产99国产精品澳门| 欧美人与性动交α欧美精品济南到| 国产欧美日韩综合一区在线观看 | 日韩午夜三级在线| 欧美在线亚洲在线| 亚洲第一中文字幕| 欧美在线观看视频在线| 欧美精品电影| 尤妮丝一区二区裸体视频| 亚洲专区在线视频| 亚洲日本久久| 免费成人性网站| 狠狠色香婷婷久久亚洲精品 |