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