| 状态条采用了动态提示,为了理解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结构。你的任务是编写自己的 代码重载这个处理器。我把这个作为家庭作业。
 |