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

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>
            久久久精品视频成人| 蘑菇福利视频一区播放| 国产精品区免费视频| 亚洲一区免费视频| 在线亚洲精品| 国产日韩欧美精品在线| 欧美在线不卡视频| 久久精品国产欧美激情| 在线免费不卡视频| 亚洲福利小视频| 国产精品99免费看 | 久久久久www| 亚洲福利视频一区| 欧美岛国激情| 欧美日韩一区二区三区四区在线观看| 在线不卡a资源高清| 欧美国产日韩在线| 欧美日韩国产在线播放| 亚洲欧美在线aaa| 久久久九九九九| 99re热这里只有精品免费视频| 亚洲精品影院| 国产一区二区三区在线观看免费| 麻豆精品91| 国产精品二区三区四区| 久久午夜电影| 欧美日韩在线大尺度| 久久九九久精品国产免费直播 | 亚洲午夜久久久久久久久电影院 | 亚洲一区二区三区高清 | 久久综合999| 欧美精品观看| 久久久国产精彩视频美女艺术照福利| 久久一区中文字幕| 亚洲欧美日韩国产一区二区三区| 久久激情网站| 亚洲欧美日韩成人| 欧美1区视频| 久久久亚洲一区| 欧美另类videos死尸| 久久免费视频在线| 国产精品高清一区二区三区| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美日韩国产首页| 久久乐国产精品| 欧美性猛交xxxx乱大交退制版 | 亚洲国产一区视频| 亚洲在线视频免费观看| 99re66热这里只有精品4| 久久精品日产第一区二区三区| 亚洲一卡久久| 欧美了一区在线观看| 理论片一区二区在线| 国产精品自拍小视频| 99精品视频一区二区三区| 亚洲国产视频一区| 久久精品免视看| 久久精品99久久香蕉国产色戒| 欧美日韩专区| 99热在这里有精品免费| 亚洲免费观看| 欧美粗暴jizz性欧美20| 欧美/亚洲一区| 精品成人在线| 久久久精品国产一区二区三区 | 久久国产精品99国产精| 国产精品久久精品日日| 99成人精品| 亚洲天堂黄色| 欧美午夜a级限制福利片| 亚洲精品网址在线观看| 亚洲美女黄色| 欧美日韩国产成人在线91| 亚洲第一综合天堂另类专| 亚洲国产精品高清久久久| 久久精品视频免费| 欧美成人a视频| 亚洲精品美女在线观看播放| 欧美高清hd18日本| 亚洲级视频在线观看免费1级| 亚洲欧洲日本在线| 欧美日韩美女在线| 亚洲一二三四久久| 久久久久久久999精品视频| 伊人久久综合| 欧美精品videossex性护士| 亚洲美女在线国产| 亚洲免费视频成人| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 国产精品美女诱惑| 午夜视频在线观看一区| 老司机免费视频久久| 亚洲乱码国产乱码精品精| 欧美日韩免费观看一区三区| 亚洲视频免费在线| 久久人人爽爽爽人久久久| 亚洲欧洲日本国产| 国产精品国产三级国产aⅴ入口| 亚洲专区一区二区三区| 另类av一区二区| 日韩一级黄色av| 国产精品三级视频| 久久一区欧美| 在线视频你懂得一区| 久久久久网址| 亚洲小说欧美另类社区| 黑丝一区二区| 欧美三级午夜理伦三级中视频| 欧美一区二区| 欧美精品一区二区三区一线天视频| 99日韩精品| 欧美大片在线看免费观看| 亚洲综合三区| 亚洲欧洲日产国码二区| 国产欧美1区2区3区| 欧美国产日产韩国视频| 亚洲欧美视频一区二区三区| 欧美激情无毛| 久久国产精品高清| 亚洲午夜电影| 亚洲激情社区| 国产一区二区毛片| 国产精品成av人在线视午夜片| 久久尤物电影视频在线观看| 亚洲永久字幕| 中国成人黄色视屏| 日韩视频不卡| 亚洲国产影院| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲高清二区| 国内精品免费在线观看| 欧美日韩一视频区二区| 欧美成人精品在线播放| 久久av老司机精品网站导航| 一区二区三区高清在线 | 亚洲视频在线观看视频| 亚洲国产日韩欧美| 黄色影院成人| 极品av少妇一区二区| 国产精品久久国产精麻豆99网站| 欧美精彩视频一区二区三区| 乱码第一页成人| 麻豆免费精品视频| 久久久综合网| 久久青草久久| 蘑菇福利视频一区播放| 欧美不卡在线| 欧美国产视频在线观看| 欧美黑人在线观看| 欧美人成网站| 国产精品成人一区二区三区夜夜夜| 欧美另类69精品久久久久9999| 欧美不卡一区| 欧美日韩综合网| 国产精品男gay被猛男狂揉视频| 国产精品久久二区二区| 国产精品资源在线观看| 国产一区激情| 亚洲第一二三四五区| 亚洲黄色在线观看| 日韩小视频在线观看专区| 日韩天堂av| 亚洲欧美日韩成人| 久久久噜噜噜久久狠狠50岁| 玖玖精品视频| 亚洲高清久久久| 夜夜夜久久久| 久久av二区| 欧美不卡三区| 国产精品乱子久久久久| 国产一区视频在线看| 亚洲国产视频直播| 亚洲在线观看免费视频| 午夜精品久久久久久久久久久| 欧美一区亚洲| 久久综合亚洲社区| 亚洲欧洲美洲综合色网| 亚洲私人影院| 久久综合九色综合久99| 欧美性猛交xxxx乱大交退制版| 国产自产精品| 在线亚洲精品福利网址导航| 欧美一区观看| 亚洲黄色av一区| 国产日韩欧美日韩| 亚洲激情视频在线观看| 午夜一级久久| 亚洲精品久久久久久久久久久 | 亚洲国产欧美日韩另类综合| 亚洲素人在线| 欧美成人影音| 好看不卡的中文字幕| 亚洲一区观看| 亚洲精品123区| 欧美一区二区三区精品| 欧美日韩国产黄| 91久久亚洲| 美女精品在线观看| 欧美一区二区三区婷婷月色 | 极品日韩久久|