m_htooltip = ::createwindow(tooltips_class, text(""),
ws_popup| dwstyle,
cw_usedefault, cw_usedefault,
cw_usedefault, cw_usedefault,
null, (hmenu)null, hinstance,
null);
// 设置控件的一些初始参数
ti.cbsize = sizeof(toolinfo);
ti.uflags = ttf_idishwnd | ttf_transparent | ttf_track | ttf_absolute;//ttf_centertip
ti.hwnd = hparent;
ti.uid = (uint)hparent;
ti.hinst = hinstance;
ti.lpsztext = const_cast<lptstr>(scztiptext);
if(scztiptext != lpstr_textcallback) {
//以下设定缺省提示文本
if(scztiptext) {//如果当前菜单存在提示文本,则将其存放到m_szdefault
_tcscpy(m_szdefault, scztiptext);
}
else {//如果不存在提示文本,则显示以下字符串
_tcscpy(m_szdefault, _t("no text associated"));
}
}
ti.rect.left = ti.rect.top = ti.rect.bottom = ti.rect.right = 0;
//把提示添加到控件中
::sendmessage(m_htooltip,ttm_addtool,0,(lparam)&ti);
::sendmessage(m_htooltip, ttm_setmaxtipwidth, 0, 300);
if(scztiptitle) {
::sendmessage(m_htooltip, ttm_settitle, 1, (lparam)scztiptitle);
}
}
inline //以下内联函数设定在选定菜单时所做的操作
void cmenutooltip::onmenuselect(uint nitemid, uint nflags, hmenu hsubmenu)
{
if(nflags & mf_popup
|| (nflags == 0xffff && hsubmenu == null)) { // 菜单关闭时不出现提示
showtooltip(false);
}
if(!(nflags & mf_popup)) {
// 设置提示的位置
settooltipposition(hsubmenu, nitemid);
// 更新提示的文本
tchar szbuff[256];//定义一个存放提示文本的字符数组
szbuff[0] = 0;
//将指定的提示文本存放到预先设定的缓冲区中
int nret = ::loadstring(m_hinstance, nitemid, szbuff, 256);
#if 0
for(int i = 0; i < nret; i++)
{
if(szbuff[i] == _t('\n'))
{
szbuff[i] = 0;
break;
}
}
#endif
//以下部分主要用于更新提示文本,否则文本是固定的
if(szbuff[0] != 0) {
updatetooltiptext(szbuff);
}
else {
updatetooltiptext(m_szdefault);
}
showtooltip(true);//设定需要显示提示
}
}
#endif _menu_tooltip
上面的注释写的比较详细了,您可以在相应的地方做修改,以更改提示的位置和内容,将上面的代码存为一个名为menutooltip.h的头文件,将其加入到您的工程当中,然后在需要处理提示信息的类的初始函数(如对话框的oninitdialog函数或者是类的构造函数)中添加如下语句:
mymenutooltip.create(m_hwnd, _t("sample menu text"), afxgetresourcehandle()
,tts_noprefix | tts_balloon
, _t("my best tool tip title")
);
同时在相应的类中创建onmenuselect函数如下:
void cmenuitemtooltipdlg::onmenuselect(uint nitemid, uint nflags, hmenu hsubmenu)
{
mymenutooltip.onmenuselect(nitemid, nflags, hsubmenu);
cwnd::onmenuselect(nitemid, nflags, hsubmenu);
}
同时不要忘了加入上述头文件,并定义一个提示信息类的变量
#include "menutooltip.h"
cmenutooltip mymenutooltip;
最后在消息循环中加入on_wm_menuselect()
一切ok了。