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

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

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

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

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

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

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

6,PreCreateWindow()://主要是注冊(cè)窗口類
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
   return FALSE;
return TRUE;
}
說(shuō)明:
CFrameWnd::PreCreateWindow()函數(shù)所在文件:MFC|SRC|WINFRM.CPP
BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
if (cs.lpszClass == NULL)
{
   VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));
    //判斷AFX_WNDFRAMEORVIEW_REG型號(hào)窗口類是否注冊(cè),如果沒(méi)有注冊(cè)則注冊(cè)
   cs.lpszClass = _afxWndFrameOrView; // COLOR_WINDOW background
    //把注冊(cè)后的窗口類名賦給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(...);//從父類繼承來(lái)的,調(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);

...
}
說(shuō)明:CreateWindowEx()函數(shù)與CREATESTRUCT結(jié)構(gòu)體參數(shù)的對(duì)應(yīng)關(guān)系,使我們?cè)趧?chuàng)建窗口之前通過(guò)可PreCreateWindow(cs)修改cs結(jié)構(gòu)體成員來(lái)修改所要的窗口外觀。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();//更新窗口
說(shuō)明:
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()){...}
//完成窗口初始化工作,完成窗口的注冊(cè),完成窗口的創(chuàng)建,顯示和更新。
nReturnCode = pThread->Run();
//繼承基類Run()方法,調(diào)用CWinThread::Run()來(lái)完成消息循環(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));
...
}
說(shuō)明:
BOOL PeekMessage(,,,,)函數(shù)說(shuō)明
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)過(guò)消息映射,交由消息響應(yīng)函數(shù)進(jìn)行處理。)
}
return TRUE;
}

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

10,文檔類,視類,框架類的有機(jī)結(jié)合:
在CTEApp類CTEApp::InitInstance()函數(shù)中通過(guò)文檔模板將文檔類,視類,框架類的有機(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 2010-06-21 22:43 lhking 閱讀(464) 評(píng)論(0)  編輯 收藏 引用


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


導(dǎo)航

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

統(tǒng)計(jì)

常用鏈接

留言簿

隨筆檔案

搜索

最新評(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>
            亚洲无线观看| 亚洲欧美日韩精品在线| 久久亚洲综合色| 久久爱www久久做| 国产自产精品| 奶水喷射视频一区| 女人天堂亚洲aⅴ在线观看| 亚洲高清不卡在线| 亚洲欧洲久久| 欧美日韩黄视频| 亚洲愉拍自拍另类高清精品| 亚洲无限乱码一二三四麻| 国产精品卡一卡二| 久久久久久一区| 免费永久网站黄欧美| 夜夜嗨av一区二区三区| 亚洲特级毛片| 一区在线观看| 亚洲破处大片| 国产精品一卡二| 男人的天堂亚洲| 欧美四级在线观看| 久久久99精品免费观看不卡| 麻豆精品网站| 一区二区三区久久精品| 欧美亚洲综合久久| 亚洲欧洲视频在线| 亚洲已满18点击进入久久| 精品不卡在线| 这里只有精品视频| 91久久国产综合久久| 在线性视频日韩欧美| 尤妮丝一区二区裸体视频| 日韩视频一区二区在线观看 | 一区二区精品在线观看| 国产老女人精品毛片久久| 欧美77777| 国产精品手机在线| 亚洲国产精品免费| 国产一区二区三区四区五区美女| 欧美好吊妞视频| 国产乱码精品一区二区三区忘忧草 | 欧美影院精品一区| 亚洲免费播放| 久久嫩草精品久久久精品一| 亚洲性视频h| 免费视频一区| 久久嫩草精品久久久久| 国产精品免费看片| 亚洲黄色av| 一区福利视频| 欧美综合国产| 欧美一区亚洲一区| 国产精品高潮视频| 亚洲精品综合久久中文字幕| 在线观看av不卡| 欧美一区二区日韩| 午夜一区二区三视频在线观看| 欧美激情成人在线| 亚洲激情在线激情| 亚洲激情电影中文字幕| 久久久久久午夜| 久久久久成人精品| 国产婷婷97碰碰久久人人蜜臀| 中文精品在线| 亚洲一区3d动漫同人无遮挡| 欧美激情一区二区三区在线视频观看 | 国产精品爱久久久久久久| 亚洲黄色影片| 日韩视频永久免费| 欧美 日韩 国产一区二区在线视频| 久久久另类综合| 国外成人网址| 久久综合色88| 91久久夜色精品国产九色| 亚洲人成网站影音先锋播放| 欧美插天视频在线播放| 亚洲大片精品永久免费| 亚洲精品一级| 欧美日韩伦理在线免费| 一本色道久久综合亚洲精品不卡| 亚洲图片欧洲图片av| 国产精品国产三级国产普通话三级 | 欧美成人黄色小视频| 亚洲国产精品成人精品| 美女精品网站| 日韩视频一区二区三区| 亚洲欧美日韩一区| 国产欧美在线观看| 久久久久一区二区| 亚洲国产精品va在线观看黑人 | 国产精品免费视频xxxx| 亚洲欧美日韩国产| 蜜臀99久久精品久久久久久软件 | 国产日韩精品一区二区三区| 久久久91精品| 亚洲国产精品成人久久综合一区| 夜夜嗨一区二区三区| 国产精品免费在线| 久久久久久久久岛国免费| 欧美黑人在线播放| 亚洲一二三级电影| 国产丝袜一区二区三区| 欧美成人综合网站| 亚洲尤物视频网| 欧美成ee人免费视频| 亚洲视频中文字幕| 永久免费精品影视网站| 欧美日韩在线一区二区| 性视频1819p久久| 欧美激情一区| 久久福利电影| 日韩视频一区二区三区| 国产午夜精品在线观看| 欧美成人午夜剧场免费观看| 亚洲欧美精品在线| 亚洲黄网站黄| 久久久久久久精| 亚洲一区二区三区四区在线观看 | 亚洲精品在线免费观看视频| 国产精品观看| 欧美激情亚洲自拍| 午夜国产一区| 日韩视频一区二区在线观看| 久久亚洲春色中文字幕| 亚洲男人av电影| 亚洲激情二区| 黑人操亚洲美女惩罚| 国产精品成人在线| 欧美久久综合| 免费国产自线拍一欧美视频| 性欧美办公室18xxxxhd| 一区二区三区免费观看| 亚洲福利视频免费观看| 久久久综合香蕉尹人综合网| 亚洲欧美日韩视频二区| 99视频一区二区三区| 亚洲国产欧美另类丝袜| 国产一区二区三区观看| 国产精品免费看片| 欧美午夜视频网站| 欧美人与禽性xxxxx杂性| 牛牛精品成人免费视频| 久久久精品2019中文字幕神马| 亚洲自拍偷拍色片视频| 亚洲视频你懂的| 一区二区三区不卡视频在线观看 | 欧美成人精品| 免费在线成人| 欧美国产日韩一区二区在线观看| 老司机aⅴ在线精品导航| 久久精品中文字幕一区| 欧美在线资源| 久久精品日韩一区二区三区| 久久精品免费观看| 欧美在线免费观看亚洲| 欧美伊久线香蕉线新在线| 午夜精品视频| 久久精品理论片| 久久蜜桃资源一区二区老牛| 免费观看一级特黄欧美大片| 亚洲承认在线| 亚洲国产精品久久久久秋霞影院| 亚洲第一级黄色片| 亚洲人午夜精品免费| 国产精品99久久久久久白浆小说| 亚洲图色在线| 久久久久综合网| 猛男gaygay欧美视频| 欧美大片免费观看| 国产精品久久中文| 激情丁香综合| 日韩午夜激情电影| 午夜精品久久久久影视 | 亚洲激情视频网站| av成人激情| 午夜宅男欧美| 欧美69视频| 亚洲作爱视频| 久久精品在线视频| 欧美日韩精品一区二区三区| 国产精品稀缺呦系列在线| 亚洲第一网站| 亚洲欧美日本国产有色| 久久免费精品日本久久中文字幕| 91久久精品视频| 午夜精品久久久久久久99水蜜桃 | 欧美a级片一区| 欧美日韩亚洲一区二区三区在线观看 | 国产婷婷成人久久av免费高清| 亚洲承认在线| 亚洲中午字幕| 欧美v国产在线一区二区三区| 日韩视频一区二区| 久久久久久精| 国产精品午夜在线观看| 亚洲精品一区二区三区婷婷月| 午夜久久久久久| 亚洲国产日韩欧美在线动漫| 午夜电影亚洲|