狀態條采用了動態提示,為了理解DynPrompt是如何工作的,你必須對MFC的菜單提示有一些研究。當用戶的鼠標 移動到一個菜單項時,Windows發送WM_MENUSELECT和菜單項的ID。MFC的CFrameWnd處理如下:
// much simplified? void CFrameWnd::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu) { ???? SendMessage(WM_SETMESSAGESTRING, nItemID);? }?
??? 我做了一些簡化;函數的實際代碼超過了60行,但基本的意思是框架發送WM_SETMESSAGESTRING消息到自身,用WPARAM傳遞命令ID。SETMESSAGESTRING?是MFC的一個私有消息,它在afxpriv.h中定義。這個消息在狀態條窗格中設置 要顯示的文本。你可以用WPARAM傳遞資源串的ID,或者用LPARAM傳遞實際的串。
// resource string ID? SendMessage(WM_SETMESSAGESTRING, ID_MYSTRING);
// string? SendMessage(WM_SETMESSAGESTRING, 0, (LPARAM)_T("Hello, world"));?
??? 所以,如果要實現動態菜單提示,必須重載CFrameWnd::OnMenuSelect和 用提示串發送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實際代碼調用一連串函數從MRU菜單項來截獲 文件名并建立所要的文本提示。別忘了還要調用CFrameWnd::OnMenuSelect來處理 未改變的提示的命令。
??? 最后,對于如何動態改變工具提示文本的方法,CFrameWnd::OnToolTipText是MFC處理工具條通知的函數。其標準實現用匹配的命令ID加載資源串,截獲“\n”后的文本并將它拷貝調用者的TOOLTIPTEXT結構。你的任務是編寫自己的 代碼重載這個處理器。我把這個作為家庭作業。 |