狀態(tài)條采用了動(dòng)態(tài)提示,為了理解DynPrompt是如何工作的,你必須對(duì)MFC的菜單提示有一些研究。當(dāng)用戶的鼠標(biāo) 移動(dòng)到一個(gè)菜單項(xiàng)時(shí),Windows發(fā)送WM_MENUSELECT和菜單項(xiàng)的ID。MFC的CFrameWnd處理如下:
// much simplified? void CFrameWnd::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu) { ???? SendMessage(WM_SETMESSAGESTRING, nItemID);? }?
??? 我做了一些簡(jiǎn)化;函數(shù)的實(shí)際代碼超過(guò)了60行,但基本的意思是框架發(fā)送WM_SETMESSAGESTRING消息到自身,用WPARAM傳遞命令I(lǐng)D。SETMESSAGESTRING?是MFC的一個(gè)私有消息,它在afxpriv.h中定義。這個(gè)消息在狀態(tài)條窗格中設(shè)置 要顯示的文本。你可以用WPARAM傳遞資源串的ID,或者用LPARAM傳遞實(shí)際的串。
// resource string ID? SendMessage(WM_SETMESSAGESTRING, ID_MYSTRING);
// string? SendMessage(WM_SETMESSAGESTRING, 0, (LPARAM)_T("Hello, world"));?
??? 所以,如果要實(shí)現(xiàn)動(dòng)態(tài)菜單提示,必須重載CFrameWnd::OnMenuSelect和 用提示串發(fā)送WM_SETMESSAGESTRIN消息。
void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)? {? ???? if (/* nItemID has a dynamic prompt */) { ??????? CString sPrompt = // whatever you want? ??????? SendMessage(WM_SETMESSAGESTRING, 0,? (LPARAM)(LPCTSTR)sPrompt);? ??????? m_nIDTracking = nItemID;? ???? } else {? ??????? CFrameWnd::OnMenuSelect(nItemID,? nFlags, hSysMenu);? ???? }? }?
??? MainFrm.cpp文件中的OnMenuSelect實(shí)際代碼調(diào)用一連串函數(shù)從MRU菜單項(xiàng)來(lái)截獲 文件名并建立所要的文本提示。別忘了還要調(diào)用CFrameWnd::OnMenuSelect來(lái)處理 未改變的提示的命令。
??? 最后,對(duì)于如何動(dòng)態(tài)改變工具提示文本的方法,CFrameWnd::OnToolTipText是MFC處理工具條通知的函數(shù)。其標(biāo)準(zhǔn)實(shí)現(xiàn)用匹配的命令I(lǐng)D加載資源串,截獲“\n”后的文本并將它拷貝調(diào)用者的TOOLTIPTEXT結(jié)構(gòu)。你的任務(wù)是編寫自己的 代碼重載這個(gè)處理器。我把這個(gè)作為家庭作業(yè)。 |