我做了一个Ocx组件,里面有一个小Dlg,dlg上有几个按钮。请问如何给这些按钮加ToolTip?
在线等待,请速回帖。100分一定送上。
在线等待,请速回帖。100分一定送上。
解决方案 »
- Visual Studio 命令工具(2010)无法编译源码
- 关于vc2008的使用问题
- 如何禁用工具栏按钮
- 请大家进来,急急!!!
- windows中进程和消息对列得问题,需要高人指点。
- 为什么DLL文件要用Regsvr32注册后才能使用?用Regsvr32注册Dll文件起到什么作用?
- 请microgiant进来拿200分,感谢microgiant无私的奉献精神!(刚才网络好慢,等不及了,结果给错了,只好另开贴在给)
- 关于自定义消息的问题
- 不晓得各位有没有把两数据库(access)的表合并在一个数据库中的好方法。。。!
- CTreeCtrl HitTest 返回空
- 请大家帮忙额,我想实现窗口的打开,不知道如何进行,详细请进!!
- 如何在VC中调用其它的应用程序?
2、选择“Project”菜单 -->“Add to Project” -->“Components and Controls” -->“VC++ Components” --> “ToolTip Support”
3、选择“Insert”
4、在对话框资源中加入一个按钮,ID为IDC_ToolTip
5、在 CDialog::OnInitDialog() 中找到下面的注释行: // TODO: Use one of the following forms to add controls:
// m_tooltip.AddTool(GetDlgItem(IDC_), );
// m_tooltip.AddTool(GetDlgItem(IDC_), "");
然后在注释行后加入一行代码:
m_tooltip.AddTool(GetDlgItem(IDC_ToolTip), "显示 ToolTip");
经过上面的步骤之后:头文件(*.h)中会自动加入下面的代码:
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);实现文件(*.cpp)会加入方法实现:
PreTranslateMessage(MSG* pMsg);编译程序执行吧,将鼠标指针移到ToolTip按钮上就会显示出一个ToolTip信息。
2、然后增加一个消息函数定义:
afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult);
3、增加消息映射:
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText);
4、消息函数实现:
………………………………
TOOLTIPTEXTA *pTTTA = (TOOLTIPTEXTA *)pNMHDR;
TOOLTIPTEXTW *pTTTW = (TOOLTIPTEXTW *)pNMHDR;
CString strTipText;
UINT uID = pNMHDR->idForm;
if(pNMHDR->code == TTN_NEEDTEXTA && (pTTTA ->uFlags & TTF_IDISHWND_\) || pNMHDR->code == TTN_NEADTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
uID = ::GetDlgCtrlID((HWND)uID); //idForm位工具栏的HWND
if(uID != 0) //不为分割符
{
strTipText.LoadString(uID);
strTipText = strTip.Mid(strTipText.Find('\n', 0) + 1);#ifndef _UNICODE
if(pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
else
_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
#else
if(pNMHDR->code == TTN_NEEDTEXTW)
_wcstombsz(pTTTA->szText, strTipText, sizeof(pTTTW->szText));
else
lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
#endif *pResult = 0;
::SetWindowPos(pNMHDR->hwndForm, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER);
return TRUE;
}
return TRUE;
}
1.在.h裡面申請
CToolTipCtrl m_tooltip;
2.在OnInitDialog()加入下面倆句話.
m_tooltip.Create(this);
m_tooltip.Activate(TRUE);
3.給Dialog程序添加PreTranslateMessage(MSG* pMsg)事件處理
函數題裡面再加入m_tooltip.RelayEvent(pMsg);這個代碼。
4.給需要的button添加和下面類似的代碼
m_tooltip.AddTool(&m_ButtonPlay,"Play");
m_tooltip.AddTool(&m_ButtonRecord,"Record");
//可以在任意你想要開始tooltip的地方加這樣的代碼.也可以放在初始里
//其中m_ButtonPlay是button的類(控件名稱)名字."Play"是toolTip內容
我的Button是在资源里画上去的,我用了一个CMyButton类(从CBitmapButton派生)的Autoload,movewindow先处理了一下,然后就是 m_tooltip.AddTool(GetDlgItem(IDC_OT_LINE),"text");
或
m_tooltip.AddTool(&m_btnPen,"text");
其它地方(PreTranslateMessage)也加上了。
可Tooltip就是不出来。
m_tooltip.AddTool(GetDlgItem(IDC_TOOLTIP), "显示 ToolTip");
就可以了,方便易用!!!
你既然生成了自己的类,可以在类中加入成员变量 CToolTipCtrl m_ToolTip;
然后重载 PreSubClass(), PreTranslateMessage()
最后加入成员函数 SetToolTipText()实现如下:*.h
class CXXXButton:CButton
{
......
protected:
static CToolTipCtrl m_ToolTip;
......public:
void SetToolTipText(LPCSTR lpszToolTipText);
.....
};
*.cpp
CToolTipCtrl CXXXButton::m_ToolTip;void CXXXButton::PreSubclassWindow()
{
if(!m_ToolTip.GetSafeHwnd())
m_ToolTip.Create(this);
m_ToolTip.AddTool(this);
CButton::PreSubclassWindow();
}
BOOL CXXXButton::PreTranslateMessage(MSG* pMsg)
{
m_ToolTip.RelayEvent(pMsg);
return CButton::PreTranslateMessage(pMsg);
}void CXXXButton::SetToolTipText(LPCSTR lpszToolTipText)
{
m_ToolTip.UpdateTipText(lpszToolTipText, this);
}
我的对话框是组件Ctrl类创建的主Dlg下的子窗口(在Dlg的OnInitDialog下创建)
由于根本就不进Button类的PreTranslateMessage,所以我在Button类的OnMouseMove中加了一个Timer,当鼠标在Button内停留一段时间后就进入OnTimer。
在OnTimer中,我生成了一个MSG对象,然后是
m_ToolTip.RelayEvent(pMsg),就OK了。结账了,
dominolili:基本是按照你说的作的,给你 25分。
jennyvanes: 虽然没用上,不过写了那么多,给你10分。
YP2002CN: 25分。
shadowac: 基本是按照你说的作的,30分。
andy_lau():5分
differ: 5分