久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

MFC淺析(3) 文檔視圖結(jié)構(gòu)中命令的處理流程

 9loong 2011-05-08
 

文檔視圖結(jié)構(gòu)中命令的處理流程

(以MDI文檔視圖結(jié)構(gòu)為例)

在應(yīng)用程序的界面上,,包含菜單,、工具條等元素,當(dāng)選取這些元素后,,將發(fā)送一個命令給程序,。同時,還有命令發(fā)送的其它形式,,例如快捷鍵等等,。

在文檔視圖結(jié)構(gòu)中,程序包括一個主框架窗口,,而具體打開的文件則包括其數(shù)據(jù)對象(CDocument) 表現(xiàn)形式(CView),和窗口容器(CFrameWnd)等幾個相關(guān)對象,。命令發(fā)送后,將按照一定的流向傳達(dá)給指定的對象,由對象內(nèi)成員函數(shù)響應(yīng)解決,。

一 命令的發(fā)送

在菜單或工具條上按下某項,,(或按了對應(yīng)的熱鍵)將向窗口發(fā)送一個WM_COMMAND消息

WM_COMMAND 參數(shù)包括3部分:
wNotifyCode = HIWORD(wParam); // 來源類型 
wID = LOWORD(wParam);         // 命令I(lǐng)D
hwndCtl = (HWND) lParam;      // 來源窗口

其中最重要的就是wID,它就是具體的命令。數(shù)值就是菜單項,、工具按鈕,、或按鍵組合的ID_?????。

在CWnd對象中,,WM_COMMAND由OnCmdMsg()響應(yīng)處理,。

在MFC程序框架中,OnCmdMsg()當(dāng)前將命令按特定流程發(fā)送給特定的對象處理,。

二 命令I(lǐng)D

通常,,命令I(lǐng)D 的數(shù)值范圍為:0x8000 -> 0xDFFF

// 8000 -> DFFF : user commands
// E000 -> EFFF : AFX commands and other things
// F000 -> FFFF : standard windows commands and other things etc
// E000 -> E7FF standard commands
// E800 -> E8FF control bars (first 32 are special)
// E900 -> EEFF standard window controls/components
// EF00 -> EFFF SC_ menu help
// F000 -> FFFF standard strings

三 命令的流向

命令發(fā)送之初,是作為WM_COMMAND消息的參數(shù)傳給當(dāng)前窗口。

如果沒有打開文件,,則WM_COMMAND發(fā)送給父窗口(CMDIFrameWnd)

如果有文件打開過,,則WM_COMMAND發(fā)送給激活的子框架窗口CMDIChildWnd)

另外CView,CWinApp,CDocument都是從CCmdTarget派生,都能響應(yīng)命令,,但它們不響應(yīng)一般的窗口消息,。

在CMDIFrameWnd和CMDIChildWnd中的OnCmdMsg()將根據(jù)需要轉(zhuǎn)發(fā)給CWinApp、CView或CDocument,。

在這些類的基類CCmdTarget中OnCmdMsg將查找該類各層次的消息映射項,查找處理函數(shù),。

(1)若沒有文件打開,,即只有主框架

概要: 在主框架內(nèi)查命令處理,若未找到,,交由應(yīng)用程序類處理,。

命令流向:主框架->應(yīng)用程序類。

具體流程:

①調(diào)用CMDIFrameWnd::OnCmdMsg

{
if(有子框架)
{
交給子框架處理;CMDIChildWnd::OnCmdMsg
return;
}
CFrameWnd::OnCmdMsg
return;
}

②CFrameWnd::OnCmdMsg為:

{
....
由基類的OnCmdMsg處理,,若框架中有該命令的處
理函數(shù),函數(shù)將返回
if(CWnd::OnCmdMsg)
return;
//如果在框架中沒有處理,,就交給應(yīng)用程序類處理命令
CWinApp::OnCmdMsg
}

③若在框架中沒有處理該命令,轉(zhuǎn)交CWinApp處理,。

CWinApp::OnCmdMsg

(2)有打開的文檔,,存在子框架、視圖對象,,文檔對象

命令流向:子框架接收到命令->視圖對象處理->文檔對象處理->文檔模板處理 ->子框架處理->應(yīng)用程序?qū)ο筇幚?

若在某一級被處理,,則流程跳出。

具體流程:

WM_COMMAND 發(fā)送到子框架,在CMDIChildWnd::OnCmdMsg中包含下面步驟:

①先讓子框架上激活的視圖對象處理

執(zhí)行CView::OnCmdMsg

調(diào)用基類的OnCmdMsg,,查找并執(zhí)行命令處理,,

若未找到,交給文檔對象來處理命令

②執(zhí)行CDocument::OnCmdMsg

在文檔對象中查找命令處理函數(shù),。

若未找到,,交由文檔模板處理。

③執(zhí)行CDocTemplate::OnCmdMsg

若命令未處理,,返回到子框架,,子框架處理

④子框架基類::OnCmdMsg執(zhí)行

若命令未處理,交由應(yīng)用程序?qū)ο筇幚?

⑤執(zhí)行CWinApp::OnCmdMsg











   




(#)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多