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

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,對于全局對象或全局變量來說,在程序運(yùn)行即WINMAIN函數(shù)加載的時(shí)候,已經(jīng)為全局對象或全局變量分配了內(nèi)存和賦初值。
所以:CTEApp theApp;->CTEApp ::CTEApp(){}->_tWinMain(){}
說明:每一個(gè)MFC程序,有且只有一個(gè)從WinApp類派生的類(應(yīng)用程序類),也只有一個(gè)從應(yīng)用程序類所事例化的對象,表示應(yīng)用程序本身。在WIN32程序當(dāng)中,表示應(yīng)用程序是通過WINMAIN入口函數(shù)來表示的(通過一個(gè)應(yīng)用程序的一個(gè)事例號這一個(gè)標(biāo)識來表示的)。在基于MFC應(yīng)用程序中,是通過產(chǎn)生一個(gè)應(yīng)用程序?qū)ο螅盟鼇砦ㄒ坏谋硎玖藨?yīng)用程序。

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

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

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

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

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

6,PreCreateWindow()://主要是注冊窗口類
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
 if( !CFrameWnd::PreCreateWindow(cs) )
  return FALSE;
 return TRUE;
}
說明:
CFrameWnd::PreCreateWindow()函數(shù)所在文件: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()是個(gè)虛函數(shù),如果子類有則調(diào)用子類的。
#define VERIFY(f)          ASSERT(f)
#define AfxDeferRegisterClass(fClass) AfxEndDeferRegisterClass(fClass)
define AFX_WNDFRAMEORVIEW_REG          0x00008
const TCHAR _afxWndFrameOrView[] = AFX_WNDFRAMEORVIEW;//WINCORE.CPP文件中,定義為全局?jǐn)?shù)組。
//#define AFX_WNDFRAMEORVIEW  AFX_WNDCLASS("FrameOrView")

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

CWnd::CreateEx()函數(shù)路徑:MFC|SRC|WINCORE.CPP
BOOL CWnd::CreateEx(...){
 ...
 if (!PreCreateWindow(cs))//虛函數(shù),如果子類有調(diào)用子類的。
 {
  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()函數(shù)與CREATESTRUCT結(jié)構(gòu)體參數(shù)的對應(yīng)關(guān)系,使我們在創(chuàng)建窗口之前通過可PreCreateWindow(cs)修改cs結(jié)構(gòu)體成員來修改所要的窗口外觀。PreCreateWindow(cs))//是虛函數(shù),如果子類有調(diào)用子類的。
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,消息循環(huán):
int AFXAPI AfxWinMain()
{ ...
 // Perform specific initializations
 if (!pThread->InitInstance()){...}
 //完成窗口初始化工作,完成窗口的注冊,完成窗口的創(chuàng)建,顯示和更新。
 nReturnCode = pThread->Run();
 //繼承基類Run()方法,調(diào)用CWinThread::Run()來完成消息循環(huán)
 ...
}
////////////////////////////////////////////////////////////////
CWinThread::Run()方法路徑:MFC|SRC|THRDCORE.CPP
int CWinThread::Run()
{ ...
  // phase2: pump messages while available
  do//消息循環(huán)
  {
   // pump message, but quit on WM_QUIT
   if (!PumpMessage())//取消息并處理
    return ExitInstance();
   ...
  } while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
 ...
}
說明:
BOOL PeekMessage(,,,,)函數(shù)說明
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);//進(jìn)行消息(如鍵盤消息)轉(zhuǎn)換
  ::DispatchMessage(&m_msgCur);//分派消息到窗口的回調(diào)函數(shù)處理(實(shí)際上分派的消息經(jīng)過消息映射,交由消息響應(yīng)函數(shù)進(jìn)行處理。)
 }
 return TRUE;
}

9,文檔與視結(jié)構(gòu):
可以認(rèn)為View類窗口是CMainFram類窗口的子窗口。
DOCument類是文檔類。
DOC-VIEW結(jié)構(gòu)將數(shù)據(jù)本身與它的顯示分離開。
文檔類:數(shù)據(jù)的存儲,加載
視類:數(shù)據(jù)的顯示,修改

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

posted on 2008-03-11 15:06 弱水一瓢 閱讀(279) 評論(0)  編輯 收藏 引用 所屬分類: MFC

<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導(dǎo)航

統(tǒng)計(jì)

文章分類

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲丰满在线| av不卡在线| 欧美激情第1页| 欧美日韩一区二区视频在线| 国产精品亚洲综合天堂夜夜| 亚洲欧洲日产国产网站| 亚洲一区免费视频| 欧美成人免费网| 亚洲午夜精品一区二区三区他趣| 久久中文字幕一区| 国产日韩一区二区| 亚洲一区国产一区| 亚洲一区二区三区色| 欧美国产综合视频| 亚洲图片在区色| 欧美激情bt| 久久久久久久91| 国产日韩精品视频一区| 亚洲天堂成人| 欧美亚洲视频在线看网址| 欧美日韩在线观看一区二区| 亚洲综合不卡| 久久xxxx| 黄色一区二区三区| 久久av老司机精品网站导航| 99精品视频免费观看视频| 久久免费视频网| 好吊成人免视频| 久久九九免费视频| 香港久久久电影| 国产小视频国产精品| 欧美77777| 免播放器亚洲一区| 亚洲国产欧美久久| 欧美国产免费| 国产精品久久久久久亚洲调教| 中文精品视频| 久久免费国产精品| 午夜精品在线观看| 亚洲欧美日韩国产综合| 国产欧美日韩不卡| 最近看过的日韩成人| 欧美精彩视频一区二区三区| 亚洲伦理自拍| 一区二区三区精密机械公司| 国产精品久久久久久久久久久久久久| 亚洲麻豆一区| 久久精品国产成人| 亚洲免费观看高清在线观看| 欧美一区激情| 亚洲欧美日韩国产综合| 欧美一区二区三区免费大片| 亚洲永久视频| 欧美日韩精品免费观看| 欧美亚洲系列| 久久在线视频在线| 久久免费国产| 欧美日韩亚洲不卡| 亚洲日本成人网| 国产日韩精品一区二区三区在线| 一本到高清视频免费精品| 亚洲人www| 美女在线一区二区| 欧美不卡在线视频| 亚洲国产精品久久久久| 一本色道综合亚洲| 夜夜爽99久久国产综合精品女不卡| 久久五月天婷婷| 欧美/亚洲一区| 亚洲激精日韩激精欧美精品| 久久伊人亚洲| 亚洲激情午夜| 一区二区三区国产盗摄| 欧美一区日本一区韩国一区| 久久精品国产2020观看福利| 欧美精品aa| 99国内精品| 午夜精品在线| 狠狠综合久久| 欧美激情精品久久久久久变态 | 欧美激情一区三区| 亚洲国产一区视频| 国产视频综合在线| 久久精品国产精品| 欧美国产免费| 亚洲图片你懂的| 国产亚洲精品美女| 夜夜嗨av一区二区三区中文字幕 | 久久久久免费观看| 一区二区在线观看视频| 欧美aaaaaaaa牛牛影院| 久久久久国产一区二区三区| 一区免费观看视频| 欧美交受高潮1| 亚洲主播在线播放| 亚洲一区二区欧美日韩| 欧美黄色aaaa| 亚洲欧美第一页| 欧美不卡视频一区| 亚洲在线免费| 禁久久精品乱码| 欧美日韩一区三区| 羞羞漫画18久久大片| 欧美aa在线视频| 亚洲免费中文字幕| 激情av一区二区| 欧美视频观看一区| 亚洲视频福利| 欧美在线观看视频在线| 国产伦精品一区二区三区在线观看| 中文欧美日韩| 欧美成人午夜激情在线| 亚洲视频免费| 亚洲国产精品久久久| 国产精品影音先锋| 欧美日韩精品一区视频 | 亚洲人成在线播放网站岛国| 午夜精品久久久久久| 亚洲国产一区在线观看| 国产精品一区二区三区四区| 欧美精品日韩一区| 久久精品国产在热久久| 美日韩丰满少妇在线观看| 在线不卡视频| 欧美剧在线观看| 一区二区三区高清在线观看| 免费看的黄色欧美网站| 欧美伊人久久大香线蕉综合69| 999亚洲国产精| 国产精品美女久久久久av超清 | 国产亚洲一区二区在线观看| 欧美日韩在线大尺度| 欧美高清视频www夜色资源网| 久久都是精品| 久久福利毛片| 久久精品91久久久久久再现| 亚洲一区二区网站| 亚洲色图自拍| 中日韩高清电影网| 99热免费精品| 99视频一区二区三区| 亚洲欧洲精品成人久久奇米网| 欧美激情二区三区| 欧美成人亚洲成人| 欧美大成色www永久网站婷| 蜜臀av一级做a爰片久久| 老鸭窝亚洲一区二区三区| 亚洲国产欧美一区| 有码中文亚洲精品| 亚洲成人资源网| 国产精品日韩二区| 欧美日韩免费看| 欧美特黄一级大片| 国产精品综合不卡av| 国产精品一区在线播放| 国产精品推荐精品| 国产亚洲成人一区| 伊人婷婷久久| 亚洲人体1000| 一区二区三区不卡视频在线观看 | 午夜日韩av| 久久精品国产久精国产爱| 久久精品国产亚洲一区二区| 免费观看在线综合色| 亚洲成人直播| 欧美va天堂va视频va在线| 欧美77777| 日韩一区二区精品在线观看| 欧美大片一区二区三区| 亚洲福利小视频| 在线亚洲免费视频| 欧美一区日韩一区| 猛干欧美女孩| 国产精品久久久久三级| 国产一区二区黄色| 亚洲免费成人| 欧美在线免费播放| 欧美国产免费| 亚洲午夜小视频| 久久综合精品一区| 欧美日韩一本到| 激情欧美日韩一区| 亚洲小说区图片区| 免播放器亚洲一区| 亚洲天堂av综合网| 久久九九免费| 国产精品狠色婷| 亚洲精品久久久久久久久| 亚洲激情校园春色| 午夜国产精品视频| 亚洲第一精品在线| 翔田千里一区二区| 欧美日韩性生活视频| 怡红院精品视频| 香港久久久电影| 亚洲日本国产| 久久久国产精品一区二区三区| 欧美日韩免费一区二区三区| 亚洲二区三区四区| 欧美在线免费观看|