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

MFC程序框架的剖析

1,尋找WinMain人口:
在安裝目錄下找到MFC文件夾下的SRC文件夾,SRC下是MFC源代碼。
路徑:MFC|SRC|APPMODUL.CPP:
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
注意:(#define _tWinMain   WinMain)

2,對于全局對象或全局變量來說,在程序運行即WINMAIN函數加載的時候,已經為全局對象或全局變量分配了內存和賦初值。
所以:CTEApp theApp;->CTEApp ::CTEApp(){}->_tWinMain(){}
說明:每一個MFC程序,有且只有一個從WinApp類派生的類(應用程序類),也只有一個從應用程序類所事例化的對象,表示應用程序本身。在WIN32程序當中,表示應用程序是通過WINMAIN入口函數來表示的(通過一個應用程序的一個事例號這一個標識來表示的)。在基于MFC應用程序中,是通過產生一個應用程序對象,用它來唯一的表示了應用程序。

3,通過構造應用程序對象過程中調用基類CWinApp的構造函數,在CWinApp的構造函數中對程序包括運行時一些初始化工作完成了。
CWinApp構造函數:MFC|SRC|APPCORE.CPP
CWinApp::CWinApp(LPCTSTR lpszAppName){...}//帶參數,而CTEApp構造函數沒有顯式向父類傳參,難道CWinApp()有默認參數?見下:
(在CWinApp類定義中, CWinApp(LPCTSTR lpszAppName = NULL); )
注意:CWinApp()函數中:
pThreadState->m_pCurrentWinThread = this;
pModuleState->m_pCurrentWinApp = this
(this指向的是派生類CTEApp對象,即theApp)
調試:CWinApp::CWinApp();->CTEApp theApp;(->CTEApp ::CTEApp())->CWinApp::CWinApp()->CTEApp ::CTEApp()->_tWinMain(){}

4,_tWinMain函數中通過調用AfxWinMain()函數來完成它要完成的功能。(Afx*前綴代表這是應用程序框架函數,是一些全局函數,應用程序框架是一套輔助生成應用程序的框架模型,把一些類做一些有機的集成,我們可根據這些類函數來設計自己的應用程序)。
AfxWinMain()函數路徑:MFC|SRC|WINMAIN.CPP:
在AfxWinMain()函數中:
CWinApp* pApp = AfxGetApp();
說明:pApp存儲的是指向WinApp派生類對象(theApp)的指針。
//_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp()
// { return afxCurrentWinApp; }

調用pThread->InitInstance()
說明:pThread也指向theApp,由于基類中virtual BOOL InitApplication()定義為虛函數,所以調用pThread->InitInstance()時候,調用的是派生類CTEApp的InitInstance()函數。

nReturnCode = pThread->Run();
說明:pThread->Run()完成了消息循環。

5,注冊窗口類:AfxEndDeferRegisterClass();
AfxEndDeferRegisterClass()函數所在文件:MFC|SRC|APPCORE.CPP
BOOL AFXAPI AfxEndDeferRegisterClass(LONG fToRegister){...}
說明:設計窗口類:在MFC中事先設計好了幾種缺省的窗口類,根據不同的應用程序的選擇,調用AfxEndDeferRegisterClass()函數注冊所選擇的窗口類。
調試:CWinApp::CWinApp();->CTEApp theApp;(->CTEApp ::CTEApp())->CWinApp::CWinApp()->CTEApp ::CTEApp()->_tWinMain(){}//進入程序
->AfxWinMain();->pApp->InitApplication();->pThread->InitInstance()//父類InitInstance虛函數;->CTEApp::InitInstance()//子類實現函數;->AfxEndDeferRegisterClass(LONG fToRegister)//注冊所選擇的窗口類(出于文檔管理,注冊提前,正常的應在PreCreateWindow中進行注冊)//之后進入創建窗口階段(以下再不做調試)

6,PreCreateWindow()://主要是注冊窗口類
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
   return FALSE;
return TRUE;
}
說明:
CFrameWnd::PreCreateWindow()函數所在文件:MFC|SRC|WINFRM.CPP
BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
if (cs.lpszClass == NULL)
{
   VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));
    //判斷AFX_WNDFRAMEORVIEW_REG型號窗口類是否注冊,如果沒有注冊則注冊
   cs.lpszClass = _afxWndFrameOrView; // COLOR_WINDOW background
    //把注冊后的窗口類名賦給cs.lpszClass
}

if ((cs.style & FWS_ADDTOTITLE) && afxData.bWin4)
   cs.style |= FWS_PREFIXTITLE;

if (afxData.bWin4)
   cs.dwExStyle |= WS_EX_CLIENTEDGE;

return TRUE;
}

其中:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);//PreCreateWindow()是個虛函數,如果子類有則調用子類的。
#define VERIFY(f)          ASSERT(f)
#define AfxDeferRegisterClass(fClass) AfxEndDeferRegisterClass(fClass)
define AFX_WNDFRAMEORVIEW_REG          0x00008
const TCHAR _afxWndFrameOrView[] = AFX_WNDFRAMEORVIEW;//WINCORE.CPP文件中,定義為全局數組。
//#define AFX_WNDFRAMEORVIEW AFX_WNDCLASS("FrameOrView")

7,創建窗口:
Create()函數路徑:MFC|SRC|WINFRM.CPP:
CFrameWnd::Create(...){
...
CreateEx(...);//從父類繼承來的,調用CWnd::CreateEx().
...
}

CWnd::CreateEx()函數路徑:MFC|SRC|WINCORE.CPP
BOOL CWnd::CreateEx(...){
...
if (!PreCreateWindow(cs))//虛函數,如果子類有調用子類的。
{
   PostNcDestroy();
   return FALSE;
}
...
HWND hWnd = ::CreateWindowEx(cs.dwExStyle, cs.lpszClass,
   cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy,
   cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams);

...
}
說明:CreateWindowEx()函數與CREATESTRUCT結構體參數的對應關系,使我們在創建窗口之前通過可PreCreateWindow(cs)修改cs結構體成員來修改所要的窗口外觀。PreCreateWindow(cs))//是虛函數,如果子類有調用子類的。
HWND CreateWindowEx(
DWORD dwExStyle,     
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,       
int x,               
int y,               
int nWidth,          
int nHeight,         
HWND hWndParent,     
HMENU hMenu,         
HINSTANCE hInstance,
LPVOID lpParam       
);
typedef struct tagCREATESTRUCT { // cs
    LPVOID    lpCreateParams;
    HINSTANCE hInstance;
    HMENU     hMenu;
    HWND      hwndParent;
    int       cy;
    int       cx;
    int       y;
    int       x;
    LONG      style;
    LPCTSTR   lpszName;
    LPCTSTR   lpszClass;
    DWORD     dwExStyle;
} CREATESTRUCT;

8,顯示和更新窗口:
CTEApp類,TEApp.cpp中
m_pMainWnd->ShowWindow(SW_SHOW);//顯示窗口,m_pMainWnd指向框架窗口
m_pMainWnd->UpdateWindow();//更新窗口
說明:
class CTEApp : public CWinApp{...}
class CWinApp : public CWinThread{...}
class CWinThread : public CCmdTarget
{
...
public:
CWnd* m_pMainWnd;
...
...
}

9,消息循環:
int AFXAPI AfxWinMain()
{ ...
// Perform specific initializations
if (!pThread->InitInstance()){...}
//完成窗口初始化工作,完成窗口的注冊,完成窗口的創建,顯示和更新。
nReturnCode = pThread->Run();
//繼承基類Run()方法,調用CWinThread::Run()來完成消息循環
...
}
////////////////////////////////////////////////////////////////
CWinThread::Run()方法路徑:MFC|SRC|THRDCORE.CPP
int CWinThread::Run()
{ ...
   // phase2: pump messages while available
   do//消息循環
   {
    // pump message, but quit on WM_QUIT
    if (!PumpMessage())//取消息并處理
     return ExitInstance();
    ...
   } while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
...
}
說明:
BOOL PeekMessage(,,,,)函數說明
The PeekMessage function checks a thread message queue for a message and places the message (if any) in the specified structure.
If a message is available, the return value is nonzero.
If no messages are available, the return value is zero.

/////////////////////////////////////////////////////////////
BOOL CWinThread::PumpMessage()
{
...
if (!::GetMessage(&m_msgCur, NULL, NULL, NULL))//取消息
{...}
...
// process this message
if (m_msgCur.message != WM_KICKIDLE && !PreTranslateMessage(&m_msgCur))
{
   ::TranslateMessage(&m_msgCur);//進行消息(如鍵盤消息)轉換
   ::DispatchMessage(&m_msgCur);//分派消息到窗口的回調函數處理(實際上分派的消息經過消息映射,交由消息響應函數進行處理。)
}
return TRUE;
}

9,文檔與視結構:
可以認為View類窗口是CMainFram類窗口的子窗口。
DOCument類是文檔類。
DOC-VIEW結構將數據本身與它的顯示分離開。
文檔類:數據的存儲,加載
視類:數據的顯示,修改

10,文檔類,視類,框架類的有機結合:
在CTEApp類CTEApp::InitInstance()函數中通過文檔模板將文檔類,視類,框架類的有機組織一起。
...
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTEDoc),
RUNTIME_CLASS(CMainFrame),       // main SDI frame window
RUNTIME_CLASS(CTEView));
AddDocTemplate(pDocTemplate);//增加到模板
...


posted on 2010-06-21 22:43 lhking 閱讀(464) 評論(0)  編輯 收藏 引用


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


導航

<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

統計

常用鏈接

留言簿

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美另类videos死尸| 99成人精品| 中文国产亚洲喷潮| 亚洲国产婷婷综合在线精品| 亚洲尤物在线| 亚洲综合欧美| 欧美人妖在线观看| 亚洲二区视频| 亚洲激情在线观看| 久久精品在线免费观看| 午夜免费在线观看精品视频| 欧美日韩精品免费观看| 亚洲国产女人aaa毛片在线| 尤物精品在线| 久久国产日韩| 久久久www成人免费精品| 国产精品亚洲成人| 亚洲午夜高清视频| 新狼窝色av性久久久久久| 欧美日韩一区二区三区四区在线观看| 亚洲黄页一区| 99热在线精品观看| 欧美乱妇高清无乱码| 亚洲精美视频| 一区二区三区偷拍| 国产精品成人在线观看| 亚洲视频一区二区| 欧美制服丝袜| 好看的av在线不卡观看| 久久久国产精品一区二区中文| 久久久亚洲国产美女国产盗摄| 国产真实乱子伦精品视频| 欧美一区2区三区4区公司二百| 久久久久久久性| 在线播放日韩专区| 蜜桃av噜噜一区二区三区| 亚洲国产日日夜夜| 这里只有精品视频| 国产精品乱码妇女bbbb| 欧美一级视频免费在线观看| 久久久久国色av免费观看性色| 一区二区三区在线看| 久久综合一区二区| 亚洲久色影视| 欧美一区二区三区日韩| 国内一区二区三区在线视频| 男人的天堂亚洲在线| 在线中文字幕一区| 久久午夜视频| 亚洲精品老司机| 国产精品女主播在线观看| 欧美制服丝袜| 亚洲精品美女在线| 久久精品91| 最新国产成人av网站网址麻豆| 欧美日韩一区二区三区四区在线观看 | aa级大片欧美三级| 国产精品无码专区在线观看| 久久青青草综合| 夜夜躁日日躁狠狠久久88av| 久久久国产一区二区| 亚洲精选久久| 好看的日韩av电影| 欧美日韩精品二区| 久久久人成影片一区二区三区 | 欧美一级午夜免费电影| 亚洲电影免费| 久久av资源网站| 亚洲三级影院| 狠狠色狠狠色综合日日tαg| 欧美日韩免费观看一区三区| 蜜乳av另类精品一区二区| 欧美伊久线香蕉线新在线| 一区二区精品在线| 欧美一区二区| 欧美韩国在线| 久久亚洲高清| 亚洲成在人线av| 欧美 日韩 国产一区二区在线视频| 免费成人网www| 亚洲欧洲日夜超级视频| 欧美精品一区二区高清在线观看| 亚洲国产视频一区二区| 妖精视频成人观看www| 欧美日韩精品在线| 亚洲欧美一区二区三区极速播放| 久久精品免费电影| 亚洲国产精品第一区二区| 欧美黑人国产人伦爽爽爽| 亚洲精选91| 欧美一区二区在线播放| 韩国成人理伦片免费播放| 欧美xx69| 亚洲欧美国产精品专区久久| 久久综合久久综合九色| 日韩一级在线| 国产欧美一区二区三区国产幕精品 | 亚洲欧美在线看| 国内免费精品永久在线视频| 美女视频一区免费观看| 亚洲视频一二| 欧美成人乱码一区二区三区| 亚洲一区图片| 欲香欲色天天天综合和网| 欧美日韩精品一区| 久久激情视频| 中文一区字幕| 欧美激情第五页| 久久本道综合色狠狠五月| 日韩视频久久| 1769国产精品| 国产精品女人网站| 欧美精品一区二区三区视频| 久久aⅴ国产欧美74aaa| 一区二区三区精密机械公司| 欧美成人精品福利| 久久成人人人人精品欧| 一本色道88久久加勒比精品| 黄色日韩网站视频| 国产欧美日韩不卡| 欧美午夜视频网站| 欧美激情综合色| 久久久精品日韩欧美| 亚洲欧美日韩精品一区二区| 亚洲激情午夜| 欧美国产亚洲另类动漫| 久久精品国产在热久久| 午夜国产精品影院在线观看| 日韩一级裸体免费视频| 亚洲日本黄色| 亚洲成人资源网| 一区二区三区在线免费观看| 国产精品欧美日韩| 欧美午夜片在线观看| 欧美日韩精品一区二区| 欧美激情欧美激情在线五月| 久久久久久久久久久久久9999| 午夜在线一区| 午夜欧美精品| 欧美一区二区在线| 久久国产精品99国产精| 欧美亚洲日本网站| 午夜日韩视频| 欧美一区二区黄色| 久久国产欧美精品| 久久久久久夜| 蜜桃久久av| 久热精品视频在线观看| 免费看的黄色欧美网站| 欧美国产精品劲爆| 欧美精品一区二区久久婷婷| 欧美激情精品久久久久久蜜臀| 欧美gay视频激情| 欧美黄色网络| 欧美色图天堂网| 国产精品网红福利| 国产色综合久久| 在线观看亚洲视频| 亚洲精品欧美日韩| 中文国产成人精品久久一| 亚洲欧美日韩视频二区| 久久激情五月激情| 欧美不卡一区| 亚洲久色影视| 欧美一区2区视频在线观看| 久久午夜精品一区二区| 欧美另类女人| 国产一区二区精品在线观看| 亚洲成人资源网| 亚洲一区二区三区在线播放| 久久九九久久九九| 亚洲成人资源| 亚洲自拍啪啪| 欧美69wwwcom| 国产日韩欧美三级| 亚洲精品久久久久久久久| 亚洲欧美日韩人成在线播放| 久久亚洲私人国产精品va| 亚洲国产91精品在线观看| 亚洲一级免费视频| 免费的成人av| 国产精品视频午夜| 亚洲精品一二三区| 久久国产主播精品| 亚洲美女在线国产| 久久久久久电影| 欧美性大战久久久久久久| 在线观看一区| 欧美一区二区三区久久精品| 欧美激情一区二区三区| 午夜精品久久久久久久99黑人 | 91久久精品一区| 亚洲欧美日韩综合国产aⅴ| 欧美成人精品三级在线观看| 国产亚洲午夜| 亚洲在线成人精品| 亚洲国产成人av在线| 久久精品中文字幕免费mv| 国产精品老女人精品视频| 一区电影在线观看|