WEB开发网
开发学院软件开发VC 动态菜单项状态条提示工具条提示问题 阅读

动态菜单项状态条提示工具条提示问题

 2008-01-19 20:25:58 来源:WEB开发网   
核心提示:使用两个ID可能是一种简单的方法,但它不适用于所有情况,动态菜单项状态条提示工具条提示问题(3),例如在MRU文件菜单中,对于每个可能的文件名字你会需要不同的ID,截获“\n”后的文本并将它拷贝调用者的TOOLTIPTEXT结构,你的任务是编写自己的 代码重载这个处理器,本文提供一个例子程序,D

使用两个ID可能是一种简单的方法,但它不适用于所有情况。例如在MRU文件菜单中,对于每个可能的文件名字你会需要不同的ID。

本文提供一个例子程序,DynPrompt,如下图,

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

上一页  1 2 3 

Tags:动态 菜单 状态

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接