Mfc 将工具提示添加到CStatic
我还没有找到一段简洁的代码,允许我向CStatic(和CLed)控件添加/显示工具提示。显然,这样做的标准代码不适用于这种类型的控制。有人能发布代码片段吗?我希望这段代码能解决您的问题。重要的一点是使CStatic的NOTIFY属性为TRUEMfc 将工具提示添加到CStatic,mfc,static,tooltip,Mfc,Static,Tooltip,我还没有找到一段简洁的代码,允许我向CStatic(和CLed)控件添加/显示工具提示。显然,这样做的标准代码不适用于这种类型的控制。有人能发布代码片段吗?我希望这段代码能解决您的问题。重要的一点是使CStatic的NOTIFY属性为TRUE if( !m_ToolTip.Create(this)) { TRACE0("Unable to create the ToolTip!"); } else { CWnd* pWnd = GetDlgItem(IDC_STATIC_MAST
if( !m_ToolTip.Create(this))
{
TRACE0("Unable to create the ToolTip!");
}
else
{
CWnd* pWnd = GetDlgItem(IDC_STATIC_MASTER_PWD);
m_ToolTip.AddTool(pWnd,"Ok");
m_ToolTip.Activate(TRUE);
}
如果有任何问题,请告诉我。我使用这个简单的类成功地使用了多行工具提示: 为工具提示创建一个类:
class ToolTip
{
public:
static HWND CreateToolTip(int toolID, HWND hDlg, UINT id);
};
接下来,实现工具提示创建功能:
HWND ToolTip::CreateToolTip(int toolID, HWND hDlg, UINT id)
{
if (!toolID || !hDlg || !id)
{
return FALSE;
}
CString strTTText;
strTTText.LoadString( id );
// Get the window handle of the control to attach the TT to.
HWND hwndTool = ::GetDlgItem(hDlg, toolID);
// Create the tooltip window
HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
WS_POPUP |TTS_ALWAYSTIP,// | TTS_BALLOON,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
hDlg, NULL,
AfxGetInstanceHandle() , NULL);
if (!hwndTool || !hwndTip)
{
return (HWND)NULL;
}
// Associate the tooltip with the tool.
TOOLINFO toolInfo = { 0 };
toolInfo.cbSize = sizeof(toolInfo);
toolInfo.hwnd = hDlg;
toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
toolInfo.uId = (UINT_PTR)hwndTool;
toolInfo.lpszText = (char*)(LPCTSTR)strTTText;
::SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);
::SendMessageA(hwndTip, TTM_SETMAXTIPWIDTH, 0, 40); // force multi-line
return hwndTip;
}
在InitDialog中的某个地方调用它:
CMyDialog::InitDialog()
{
ToolTip::CreateToolTip( PickAUniqueNumber, m_hWnd, IDS_MY_RESOURCE_STRING );
}
当我在基于对话框的自动创建的mfc应用程序上添加CStatic时,工具提示在我在预翻译对话框消息中添加RelayEvent之前不会显示
BOOL CTooltipStaticDlg::PreTranslateMessage(MSG* pMsg)
{
m_ToolTip.RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg);
}
我不知道这是否仍然需要,但以下是我用来解决问题的方法:
创建静态标签时,只需将SS_NOTIFY添加到dwStyle。(或者只需在属性中设置“Nofity”“True”)。这对我来说很好。我的对话框标签上有指定的自定义ID IDC\u路径。我需要打开标签的Notify标志(SS_Notify),并且我需要在TOOLHITTEST上重载CWnd方法,并像这样处理工具提示命中测试:
INT_PTR CPath::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
{
INT_PTR r = CWnd::OnToolHitTest(point,pTI);
this->ClientToScreen(&point);
CRect rcLbl;
GetDlgItem(IDC_PATH)->GetWindowRect(&rcLbl);
if( rcLbl.PtInRect(point) )
{
pTI->uFlags |= TTF_IDISHWND;
pTI->uFlags &= ~TTF_NOTBUTTON;
pTI->uId = (UINT_PTR)GetDlgItem(IDC_PATH)->m_hWnd;
return IDC_PATH;
}
return r;
}
然后我的对话框开始接收TTN_NEEDTEXT通知,我处理了该通知并动态设置工具提示的文本
BOOL CPath::OnTtnNeedText(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
UNREFERENCED_PARAMETER(id);
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
UINT_PTR nID = pNMHDR->idFrom;
BOOL bRet = FALSE;
if (pTTT->uFlags & TTF_IDISHWND)
{
// idFrom is actually the HWND of the tool
nID = ::GetDlgCtrlID((HWND)nID);
if(nID == IDC_PATH)
{
pTTT->lpszText = (LPSTR)(LPCTSTR)m_FullDestPath;
bRet = TRUE;
}
}
*pResult = 0;
return bRet;
}
我需要这样做,并实现一个
PreTranslateMessage
处理程序,如中所述,然后它才能工作。还可以指出,m_ToolTip
是一个ctoolticptrl
。这就是我所缺少的。。。已经有了RelayEvent位,并且我已经用一个控制变量创建了静态文本,因为我实时修改了它。因此,在属性中将Notify设置为True是一个简单的解决方案。感谢您花时间发布答案!