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

winlinglin

MFC學(xué)習(xí)筆記(一)

Win32應(yīng)用程序有條明確的主線:
 (1) 進(jìn)入WinMain函數(shù)
 (2) 設(shè)計(jì)一個(gè)Window
 (3) 注冊(cè)這個(gè)Window
 (4) 建立這個(gè)Window
 (5) 顯示和更新這個(gè)Window
 (6) 進(jìn)入消息循環(huán)
 
好,我就先找WinMain函數(shù)吧。
我在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是一個(gè)宏,詳細(xì)為: #define _tWinMain WinMain
所以這個(gè)確實(shí)是我們要找的WinMain函數(shù)

從代碼中看出,WinMain將參數(shù)全部交給AfxWinMain,來(lái)處理。
好,我又找AfxWinMain這個(gè)函數(shù)。

我在winmain.cpp的19行找到了AfxWinMain函數(shù)。
代碼:
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 _In_ LPTSTR lpCmdLine, int nCmdShow)
{
 ASSERT(hPrevInstance == NULL);   // ASSERT在程序運(yùn)行時(shí)它計(jì)算括號(hào)內(nèi)的表達(dá)式,如果表達(dá)式為FALSE (0),
           // 程序?qū)?bào)告錯(cuò)誤,并終止執(zhí)行。如果表達(dá)式不為0,則繼續(xù)執(zhí)行后面的語(yǔ)句。
           // ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略。
           // assert()的功能類(lèi)似,它是ANSI C標(biāo)準(zhǔn)中規(guī)定的函數(shù),它與ASSERT的一個(gè)重要區(qū)別是可以用在Release版本中。
 int nReturnCode = -1;
 // AfxGetThread和 AfxGetApp 都是全局函數(shù)
 CWinThread* pThread = AfxGetThread();  // 獲得正在執(zhí)行的線程,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已經(jīng)過(guò)時(shí),用InitInstance代替,完成MFC內(nèi)部管理方面的工作
  goto InitFailure;

 // Perform specific initializations
 if (!pThread->InitInstance())  // 初始化Instance,在每個(gè) a copy of the program runs的時(shí)候,虛函數(shù)
 {
  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.返回一個(gè)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函數(shù)后,看了下MFC為我生成的類(lèi):
1. CTestApp  2. CTestView 3. CMainFrame  4. CTestDoc  5. CAboutDlg
查看CTestApp.cpp,發(fā)現(xiàn)了一個(gè)全局的CTestApp theApp,因?yàn)槿謱?duì)象必須在main函數(shù)之前產(chǎn)生并初始化,所以應(yīng)用程序調(diào)用的順序應(yīng)該是
CTestApp的構(gòu)造函數(shù) -> WinMain函數(shù)
又發(fā)現(xiàn)class CTestApp : public CWinApp,子類(lèi)的構(gòu)造函數(shù)在父類(lèi)的構(gòu)造函數(shù)調(diào)用之后調(diào)用,所以就搜索CWinApp吧。

在appcore.cpp的368行發(fā)現(xiàn)以下代碼:
CWinApp::CWinApp(LPCTSTR lpszAppName)  // 此處的lpszAppName有個(gè)默認(rèn)參數(shù)NULL
{
 if (lpszAppName != NULL)
  m_pszAppName = _tcsdup(lpszAppName); // 為lpszAppName分配內(nèi)存
 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;  // 如果有子類(lèi)繼承了CWinApp, this就是子類(lèi)
 ASSERT(AfxGetThread() == this);
 m_hThread = ::GetCurrentThread();
 m_nThreadID = ::GetCurrentThreadId();

 // initialize CWinApp state
 ASSERT(afxCurrentWinApp == NULL); // only one CWinApp object please
 pModuleState->m_pCurrentWinApp = this;   // 如果有子類(lèi)繼承了CWinApp, this就是子類(lèi)
 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的構(gòu)造函數(shù)的調(diào)用。
在CTestApp的聲明中,它重寫(xiě)了InitInstance函數(shù),如下:
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;   // 對(duì)命令查詢(xún)分析
 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函數(shù),也找到了顯示和更新窗口的語(yǔ)句,但是從哪里開(kāi)始設(shè)計(jì)窗口,注冊(cè)窗口,建立窗口呢?
我又搜索了WNDCLASS,在wincore.cpp的4495行發(fā)現(xiàn)了與設(shè)計(jì)窗口時(shí)很像的函數(shù)BOOL AFXAPI AfxEndDeferRegisterClass(LONG fToRegister)
發(fā)現(xiàn)MS已經(jīng)在里面為我注冊(cè)了一些窗口,我只要選擇自己想要的樣式就可以了。

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

好了,一切都準(zhǔn)備好了。最后就是進(jìn)入消息循環(huán)。

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


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


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

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(1)

隨筆分類(lèi)

隨筆檔案

文章分類(lèi)

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧洲在线看| 免费一级欧美片在线播放| 欧美jjzz| 美女久久一区| 亚洲精品国精品久久99热| 亚洲福利免费| 欧美日本成人| 亚洲资源在线观看| 先锋影音网一区二区| 韩国v欧美v日本v亚洲v| 免费日韩av| 欧美黑人多人双交| 亚洲一区二区不卡免费| 国产精品99久久久久久久久| 国产乱码精品一区二区三区不卡| 久久久精品欧美丰满| 久久亚洲精品网站| 亚洲最新中文字幕| 午夜精品福利一区二区三区av| 国产亚洲欧美日韩精品| 欧美va天堂在线| 欧美午夜精品一区| 久久久精品国产免大香伊| 久久久噜噜噜久久狠狠50岁| 亚洲美女啪啪| 午夜精品影院在线观看| …久久精品99久久香蕉国产| 亚洲精品免费电影| 国产视频在线观看一区二区三区| 欧美jizzhd精品欧美巨大免费| 欧美日韩免费一区| 久久人人97超碰国产公开结果| 欧美激情片在线观看| 午夜精品区一区二区三| 猫咪成人在线观看| 亚洲综合精品一区二区| 老司机一区二区三区| 性一交一乱一区二区洋洋av| 女主播福利一区| 欧美一区二区三区视频| 欧美黄色影院| 久久视频国产精品免费视频在线 | 午夜精品99久久免费| 欧美在线视频a| 在线亚洲+欧美+日本专区| 久久精品人人做人人爽电影蜜月| 99视频国产精品免费观看| 欧美在线免费播放| 亚洲免费视频在线观看| 麻豆成人精品| 狼人天天伊人久久| 国产精品视频一二| 日韩亚洲欧美在线观看| 亚洲国产第一页| 久久国产精品久久久久久久久久| 亚洲图片在区色| 欧美黄色视屏| 亚洲国产精品专区久久| 永久免费精品影视网站| 午夜精品久久久99热福利| 亚洲一区影音先锋| 欧美日韩国产综合一区二区| 欧美激情网友自拍| 亚洲第一区在线观看| 久久gogo国模裸体人体| 久久久久久成人| 国产欧美一区二区三区视频| 中文国产亚洲喷潮| 亚洲一区二区三区视频| 欧美日韩在线一区| 999在线观看精品免费不卡网站| 亚洲精品孕妇| 欧美日韩国产成人在线| 91久久精品视频| 一区二区三区四区五区精品| 欧美日韩第一区| 99re6这里只有精品| 一区二区三区四区精品| 国产精品video| 亚洲制服少妇| 久久久久久一区二区| 国产日韩av高清| 久久久之久亚州精品露出| 欧美18av| 一本色道久久综合狠狠躁篇的优点 | 亚洲国产福利在线| 亚洲伦理中文字幕| 国产精品国产自产拍高清av| 中国av一区| 久久久精品网| 亚洲人成网站影音先锋播放| 欧美日韩一级视频| 亚欧成人在线| 亚洲丶国产丶欧美一区二区三区| 亚洲毛片在线免费观看| 国产精品久久97| 久久爱www| 亚洲欧洲精品一区二区精品久久久| 日韩午夜精品| 国产色综合久久| 欧美91视频| 亚洲欧美精品在线观看| 免费人成精品欧美精品| 亚洲视频一起| 狠狠久久亚洲欧美专区| 欧美另类亚洲| 欧美自拍偷拍午夜视频| 91久久精品久久国产性色也91 | 国产欧美日韩另类一区| 久久看片网站| 亚洲一区二区三区免费观看 | 亚洲美女av网站| 国产麻豆9l精品三级站| 免费成人在线观看视频| 亚洲午夜av电影| 亚洲第一精品夜夜躁人人躁| 欧美一二三区精品| 99精品视频免费观看| 狠狠网亚洲精品| 国产精品久久久久久妇女6080| 蜜桃av一区二区| 久久国产精品第一页| 夜夜爽av福利精品导航| 亚洲第一精品夜夜躁人人躁| 欧美一区国产在线| 亚洲婷婷综合色高清在线| 136国产福利精品导航网址| 国产精品美女一区二区在线观看| 免费不卡在线观看av| 性做久久久久久久久| 亚洲视频在线播放| 亚洲人成亚洲人成在线观看| 欧美激情精品久久久六区热门 | 亚洲国产精品999| 久久女同精品一区二区| 欧美一区二区福利在线| 一区二区三区视频在线看| 亚洲欧洲综合另类| 激情欧美国产欧美| 国产日本欧美在线观看| 国产精品视频精品视频| 欧美三级电影一区| 欧美日韩亚洲一区二区三区| 免费观看不卡av| 久久综合色88| 久久只精品国产| 巨乳诱惑日韩免费av| 久久九九热re6这里有精品| 欧美一级二级三级蜜桃| 午夜精品婷婷| 欧美一区亚洲二区| 久久激情视频免费观看| 久久精品91久久香蕉加勒比| 欧美一区二区三区在线视频| 久久成人综合网| 久久久av网站| 免费观看成人| 欧美人体xx| 欧美日韩在线不卡| 国产精品视频网址| 国内视频精品| 亚洲福利视频网站| 亚洲久久成人| 亚洲一区欧美一区| 欧美伊人久久久久久午夜久久久久| 亚洲欧美视频一区| 久久精品国产久精国产思思| 久久天天躁夜夜躁狠狠躁2022 | 亚洲欧美激情视频在线观看一区二区三区| 亚洲神马久久| 久久精品网址| 欧美激情亚洲一区| 日韩一级精品视频在线观看| 亚洲性av在线| 久久久久国产精品厨房| 欧美成人精品h版在线观看| 欧美日韩视频第一区| 国产亚洲精品综合一区91| 亚洲国产一区在线| 亚洲欧美国产va在线影院| 久久亚洲不卡| 亚洲乱码精品一二三四区日韩在线 | 欧美影院成人| 欧美福利精品| 亚洲欧美激情视频在线观看一区二区三区| 久久精品九九| 欧美日韩一区二区在线观看| 黄页网站一区| 亚洲欧美日韩直播| 女仆av观看一区| 亚洲欧美一区二区三区极速播放 | 亚洲一区二区三区色| 久久免费精品日本久久中文字幕| 欧美精品v日韩精品v国产精品 | 国产精品久久久亚洲一区| 精品成人在线观看| 午夜精品久久久久久久久久久| 欧美va亚洲va日韩∨a综合色| 亚洲无线一线二线三线区别av| 蜜臀av一级做a爰片久久|