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

深入淺出MFC文檔/視圖架構(gòu)之相互關(guān)系

2006-03-21 14:20 作者: 宋寶華 出處: 天極開(kāi)發(fā) 責(zé)任編輯:方舟
  2. 消息流動(dòng)機(jī)制

  在基于"文檔/視圖"架構(gòu)的MFC程序中,用戶消息(鼠標(biāo)、鍵盤輸入等)會(huì)先發(fā)往視圖,如果視圖未處理則會(huì)發(fā)往框架窗口。所以,一般來(lái)說(shuō),消息映射宜定義在視圖中。另外,如果一個(gè)應(yīng)用同時(shí)擁有多個(gè)視圖而當(dāng)前活動(dòng)視圖沒(méi)有對(duì)消息進(jìn)行處理則消息也會(huì)發(fā)往框架窗口。

  下面我們來(lái)看實(shí)例,我們利用Visual C++向?qū)?chuàng)建一個(gè)單文檔/視圖架構(gòu)的MFC程序,在其中增加一個(gè)菜單項(xiàng)為"自定義"(ID為IDM_SELF,如圖6.4)。


圖6.4 含"自定義"菜單的單文檔/視圖架構(gòu)MFC程序

  我們分別在視圖類和框架窗口類中為"自定義"菜單添加消息映射,代碼如下:

//視圖中的消息映射和處理函數(shù)
BEGIN_MESSAGE_MAP(CExampleView, CView)
 //{{AFX_MSG_MAP(CExampleView)
  ON_COMMAND(IDM_SELF, OnSelf)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CExampleView::OnSelf()
{
 // TODO: Add your command handler code here
 AfxMessageBox("消息在視圖中處理");
}

//框架窗口中的消息映射和處理函數(shù)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
 //{{AFX_MSG_MAP(CMainFrame)
  ON_COMMAND(IDM_SELF, OnSelf)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CMainFrame::OnSelf()
{
 // TODO: Add your command handler code here
 AfxMessageBox("消息在框架窗口中處理");
}

  這時(shí)候,我們單擊"自定義"菜單,彈出對(duì)話框顯示"消息在視圖中處理";如果我們刪除框架窗口中的消息映射,再單擊"自定義"菜單,彈出對(duì)話框也顯示"消息在視圖中處理";但是,若我們將視圖中的消息映射刪除了,就會(huì)顯示"消息在框架窗口中處理"!這驗(yàn)證了我們關(guān)于消息處理順序論述的正確性。

  欲深入理解消息流動(dòng)過(guò)程,還需認(rèn)真分析CFrameWnd::OnCmdMsg、CView::OnCmdMsg函數(shù)的源代碼:

BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
 // pump through current view FIRST
 CView* pView = GetActiveView();
 if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  return TRUE;

 // then pump through frame
 if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  return TRUE;

 // last but not least, pump through app
 CWinApp* pApp = AfxGetApp();
 if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  return TRUE;

 return FALSE;
}

BOOL CView::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
 // first pump through pane
 if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  return TRUE;

 // then pump through document
 BOOL bHandled = FALSE;
 if (m_pDocument != NULL)
 {
  // special state for saving view before routing to document
  _AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
  CView* pOldRoutingView = pThreadState->m_pRoutingView;
  pThreadState->m_pRoutingView = this;
  bHandled = m_pDocument->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
  pThreadState->m_pRoutingView = pOldRoutingView;
 }

 return bHandled;
}

  分析上述源代碼可知,WM_COMMAND消息的實(shí)際流動(dòng)順序比前文敘述的"先視圖,后框架窗口"要復(fù)雜得多,文檔和應(yīng)用程序都參與了消息的處理過(guò)程。如果我們?cè)贋槲臋n和應(yīng)用添加消息映射和處理函數(shù):

//文檔的消息映射和處理函數(shù)
BEGIN_MESSAGE_MAP(CExampleDoc, CDocument)
 //{{AFX_MSG_MAP(CExampleDoc)
  ON_COMMAND(IDM_SELF, OnSelf)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CExampleDoc::OnSelf()
{
 // TODO: Add your command handler code here
 AfxMessageBox("消息在文檔中處理");
}

//應(yīng)用的消息映射和處理函數(shù)
BEGIN_MESSAGE_MAP(CExampleApp, CWinApp)
//{{AFX_MSG_MAP(CExampleApp)
ON_COMMAND(IDM_SELF, OnSelf)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CExampleApp::OnSelf()
{
 // TODO: Add your command handler code here
 AfxMessageBox("消息在應(yīng)用中處理");
}

  屏蔽掉視圖和框架窗口的消息映射,再單擊"自定義"菜單,彈出對(duì)話框顯示"消息在文檔中處理";再屏蔽掉文檔中的消息映射,彈出對(duì)話框顯示"消息在應(yīng)用中處理"!由此可見(jiàn),完整的WM_COMMAND消息的處理順序是"視圖――文檔――框架窗口――應(yīng)用"!

  實(shí)際上,關(guān)于MFC的消息流動(dòng)是一個(gè)很復(fù)雜的議題,陷于篇幅的原因,我們不可能對(duì)其進(jìn)行更詳盡的介紹,讀者可自行尋找相關(guān)資料。
共2頁(yè)。 9712
Posted on 2007-01-21 15:04 艾凡赫 閱讀(654) 評(píng)論(0)  編輯 收藏 引用 所屬分類: MFC
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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一区二区在线观看| 黄色成人在线观看| 蜜臀va亚洲va欧美va天堂| 亚洲精品日产精品乱码不卡| 亚洲日韩欧美视频| 欧美午夜精品理论片a级大开眼界| 中日韩美女免费视频网址在线观看| 夜夜嗨网站十八久久| 国产视频精品免费播放| 女人天堂亚洲aⅴ在线观看| 免费成人高清视频| 亚洲一区二区三区乱码aⅴ| 午夜欧美精品久久久久久久| 亚洲国产精品美女| 亚洲视频精品在线| 在线观看欧美亚洲| 一本色道久久88精品综合| 国产亚洲一区在线| 亚洲精品乱码| 一区二区三区亚洲| 在线视频精品一区| 在线观看三级视频欧美| 99天天综合性| 亚洲国产成人不卡| 亚洲男人的天堂在线| 91久久久久| 先锋资源久久| 亚洲午夜久久久| 久久视频精品在线| 先锋资源久久| 欧美日本一区二区三区| 久久一区二区三区四区| 国产精品激情| 亚洲精品韩国| 亚洲二区三区四区| 欧美伊久线香蕉线新在线| 日韩亚洲精品视频| 久久亚洲二区| 久久成人一区二区| 国产精品久久77777| 亚洲国产精品一区二区www在线| 国产一区二区高清| 亚洲精品国产精品国产自| 在线观看日韩av电影| 欧美一区二区三区喷汁尤物| 99精品黄色片免费大全| 欧美绝品在线观看成人午夜影视| 久久久久久久精| 国产精品男女猛烈高潮激情| 亚洲激情av| 亚洲电影免费| 另类人畜视频在线| 蜜臀久久久99精品久久久久久| 国产日韩欧美不卡在线| 99天天综合性| 亚洲欧美激情四射在线日| 欧美日韩精品久久久| 亚洲靠逼com| 一区二区国产日产| 欧美日韩免费一区二区三区| 亚洲精品五月天| 一区二区日韩精品| 欧美少妇一区| 国产亚洲欧洲一区高清在线观看| 亚洲一区二区不卡免费| 午夜精品婷婷| 国产亚洲精品美女| 久久精品2019中文字幕| 欧美成黄导航| 夜色激情一区二区| 欧美视频中文一区二区三区在线观看 | 久久超碰97人人做人人爱| 国产乱码精品1区2区3区| 午夜亚洲影视| 麻豆91精品91久久久的内涵| 亚洲成人资源网| 欧美激情女人20p| 日韩亚洲欧美成人一区| 亚洲免费在线视频| 国产日韩欧美在线视频观看| 久久综合婷婷| 亚洲乱码国产乱码精品精可以看 | 亚洲欧美久久| 国产亚洲精品久久飘花| 免费人成精品欧美精品| 一本久久综合亚洲鲁鲁五月天 | 亚洲国产精品久久久久| 欧美日韩在线大尺度| 亚洲欧美自拍偷拍| 欧美国产成人在线| 亚洲欧美日韩国产综合| 国产一区二区中文| 欧美日韩二区三区| 欧美亚洲专区| 亚洲精品国产拍免费91在线| 午夜一级在线看亚洲| 在线精品福利| 国产精品麻豆成人av电影艾秋 | 一本大道av伊人久久综合| 久久免费精品视频| 亚洲曰本av电影| 亚洲国产精品精华液网站| 国产精品入口尤物| 看片网站欧美日韩| 亚洲欧美影音先锋| 亚洲免费高清| 欧美国产日本| 久久精品99国产精品酒店日本| 亚洲裸体俱乐部裸体舞表演av| 国产精品视频区| 午夜精品久久| 亚洲午夜成aⅴ人片| 亚洲成在人线av| 国产精品羞羞答答xxdd| 欧美激情中文字幕在线| 久久免费精品视频| 亚洲欧美第一页| 亚洲视频在线一区观看| 亚洲高清在线精品| 牛牛精品成人免费视频| 久久福利视频导航| 欧美一区2区三区4区公司二百| 一区二区三区精品视频| 亚洲人被黑人高潮完整版| 在线观看亚洲视频| 国内伊人久久久久久网站视频 | 免费看亚洲片| 午夜精品在线视频| 亚洲一区在线看| 亚洲美女av在线播放| 亚洲精品专区| 亚洲精品在线免费| 亚洲裸体视频| 日韩午夜电影在线观看| 亚洲精品裸体| 亚洲精品视频一区| 亚洲精品综合精品自拍| 日韩午夜电影在线观看| 日韩亚洲一区二区| 一区二区三区鲁丝不卡| 亚洲一区二区精品在线| 亚洲视频一区二区在线观看 | 欧美高清成人| 亚洲国产日日夜夜| 最新热久久免费视频| 亚洲精品国产拍免费91在线| 99亚洲视频| 亚洲欧美日韩直播| 欧美与欧洲交xxxx免费观看| 久久精品男女| 美女精品网站| 欧美母乳在线| 国产精品日韩一区| 国产一区清纯| 亚洲国产美女精品久久久久∴| 亚洲毛片在线免费观看| 亚洲色诱最新| 久久国产欧美日韩精品| 麻豆精品一区二区av白丝在线| 欧美成人午夜视频| 在线视频欧美一区| 久久高清国产| 欧美激情一二三区| 国产精品影视天天线| 曰韩精品一区二区| 亚洲夜间福利| 久久女同精品一区二区| 91久久精品一区二区三区| 制服诱惑一区二区| 久久手机免费观看| 欧美日韩综合在线免费观看| 韩国av一区二区| 一区二区三区国产在线观看| 久久久久国产精品一区三寸| 亚洲国产精品久久精品怡红院 | 噜噜噜在线观看免费视频日韩| 亚洲激情不卡| 久久精品国产一区二区电影| 欧美久久久久久久久| 国产一级一区二区| 在线一区二区三区四区| 久久久噜噜噜久噜久久| 亚洲精品在线观| 久久亚洲免费| 国产亚洲激情| 亚洲免费在线看| 91久久亚洲| 久久久久久久一区二区| av成人老司机| 欧美国产大片| 久久黄色级2电影| 欧美三区视频| 亚洲精品中文字幕有码专区| 久久视频精品在线| 亚洲欧美www| 欧美日韩亚洲系列| 日韩视频精品在线观看| 另类成人小视频在线|