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

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

導航

<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>
            欧美一区亚洲一区| 欧美国产免费| 欧美理论大片| 亚洲综合日本| 欧美激情一区| 亚洲欧洲一区二区在线播放| 欧美在线啊v| 亚洲一区二区三区高清| 国产精品看片资源| 一本色道婷婷久久欧美| 亚洲高清不卡在线| 在线一区视频| 一区二区免费在线观看| 亚洲美女色禁图| 亚洲精品欧美日韩专区| 国产欧美一区二区三区国产幕精品| 你懂的视频欧美| 欧美色精品天天在线观看视频| 久久亚洲一区| 韩国成人福利片在线播放| 麻豆精品网站| 久久久久久穴| 久久久久国产精品一区| 免费观看日韩| 亚洲免费在线视频| 欧美国产成人精品| 欧美专区在线| 一区二区三区在线免费视频| 日韩视频在线一区| 欧美高清视频| 国产一区二区日韩精品欧美精品| 欧美视频免费| 欧美77777| 99精品国产在热久久婷婷| 日韩视频免费观看| 欧美久久99| 亚洲影视中文字幕| 欧美图区在线视频| 亚洲色诱最新| 久久成人精品一区二区三区| 伊人久久综合| 久久露脸国产精品| 亚洲综合国产| 亚洲国产精品一区二区第四页av | 国产精品成av人在线视午夜片| 亚洲网站啪啪| 久久免费精品视频| 亚洲高清视频在线| 欧美午夜一区| 亚洲第一色在线| 欧美一区2区三区4区公司二百| 亚洲三级电影全部在线观看高清| 欧美精品一区二区三区久久久竹菊| 韩日在线一区| 欧美在线|欧美| 午夜精品久久久久影视| 亚洲黄色免费网站| 欧美专区在线观看| 在线播放不卡| 国产午夜精品全部视频播放| 国产真实乱偷精品视频免| 免费成人高清视频| 亚洲一区二区三区在线观看视频| 亚洲激情在线激情| 亚洲国产91| 亚洲综合色网站| 在线欧美亚洲| 久久男人av资源网站| 亚洲人成网在线播放| 久久精品国产999大香线蕉| 亚洲影视九九影院在线观看| 亚洲大片在线观看| 国内精品久久久久影院优| 亚洲一区二区在线视频| 亚洲乱码国产乱码精品精| 国语精品中文字幕| 在线观看视频一区二区| 国产精品久久999| 国产欧美日本| 欧美日本中文| 巨胸喷奶水www久久久免费动漫| 午夜精品久久| 亚洲国产精品www| 9久草视频在线视频精品| 国内精品国产成人| 国产综合色在线视频区| 午夜精品一区二区三区在线视| 六月婷婷一区| 亚洲欧洲在线免费| 欧美韩国一区| 亚洲视频碰碰| 小黄鸭精品密入口导航| 久久精品人人做人人爽电影蜜月| 亚洲在线视频观看| 欧美日在线观看| 国产欧美午夜| av成人毛片| 久久久999成人| 亚洲丶国产丶欧美一区二区三区 | 欧美日韩综合在线| 欧美午夜精品久久久| 久久久免费精品| 国产亚洲一级高清| 在线精品一区二区| 欧美亚洲尤物久久| 日韩视频中文| 午夜欧美大尺度福利影院在线看| 久久伊人一区二区| 国产精品www色诱视频| 99精品视频免费全部在线| 欧美电影电视剧在线观看| 欧美午夜宅男影院在线观看| 亚洲国产欧美日韩另类综合| 欧美激情亚洲国产| 在线观看三级视频欧美| 亚洲人成在线观看| 欧美永久精品| 亚洲欧美大片| 精品福利免费观看| 久久精品夜色噜噜亚洲a∨| 欧美高清视频免费观看| 麻豆91精品91久久久的内涵| 欧美国产日韩一二三区| 国内精品久久久久久| 亚洲国产精品传媒在线观看 | 一区二区久久| 久久久噜噜噜久久| 亚洲精品国产精品乱码不99按摩 | 亚洲欧美国产三级| 欧美婷婷在线| 欧美在线地址| 久久国产一区| 伊人久久男人天堂| 99精品视频免费观看视频| 国产精品一区二区在线观看不卡| 性高湖久久久久久久久| 欧美激情一区二区三区蜜桃视频| 亚洲大胆女人| 久久蜜臀精品av| 欧美精品一区二区蜜臀亚洲| 欧美一区二区三区男人的天堂| 欧美一级播放| 久久综合给合| 欧美影院成年免费版| 国产精品九色蝌蚪自拍| 久久九九电影| 国产精品成人观看视频免费 | 黄色av一区| 欧美插天视频在线播放| 久久久久久久成人| 欧美国产日韩免费| 亚洲高清网站| 国产精品成人免费精品自在线观看| 久久狠狠婷婷| 免费成人你懂的| 99视频+国产日韩欧美| 亚洲日本在线观看| 亚洲黄网站在线观看| 欧美 亚欧 日韩视频在线| 香蕉久久夜色精品国产使用方法| 久久久久久有精品国产| 亚洲日本视频| 久久久久久国产精品mv| 亚洲福利在线看| 91久久中文| 欧美夜福利tv在线| 一级成人国产| 嫩草影视亚洲| 99热免费精品在线观看| 亚洲一级在线观看| 国产精品一区二区久久国产| 国产精品视频免费在线观看| 免费视频亚洲| 99精品视频免费| 国产精品国产精品| 欧美成人午夜77777| 久久久久久午夜| 午夜精品久久久久久久99水蜜桃| 欧美剧在线观看| 久久在线免费观看视频| 91久久极品少妇xxxxⅹ软件| 亚洲精品一区中文| 蜜桃精品久久久久久久免费影院| 欧美激情精品久久久久久黑人| 亚洲激情视频在线观看| 国产精品亚洲综合天堂夜夜| 久久久精品性| 亚洲精品影院| 香蕉亚洲视频| 亚洲永久免费观看| 一区二区精品| 亚洲高清三级视频| 国产精品成人播放| 久久色在线观看| 亚洲男人影院| 欧美国产三区| 亚洲精品中文字幕女同| 裸体一区二区| 欧美精品国产精品| 午夜国产精品影院在线观看|