我最近一直在为我的应用程序中的每个对话框项添加工具提示。在将每个字符串资源添加到字符串资源之前,我想在硬编码文本中执行此操作,以便在编写它们时可以轻松地更改它。现在是时候从资源文件中提取字符串了,似乎我无法让它出来并显示为工具提示。
以下代码会生成一个空白工具提示。虽然如果我用一个真实的字符串替换tmpStr,如[_T(“工具提示文本”)],它可以正常工作。
代码:
BOOL CCustomDialog::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
{
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
UINT nID = pNMHDR->idFrom;
if (pTTT->uFlags & TTF_IDISHWND)
{
nID = ::GetDlgCtrlID((HWND)nID);
}
if(nID)
{
CString tmpStr;
if( nID == IDC_BUTTON1)
{
GetDlgItemText(IDS_BUTTON1_TT, tmpStr);
_tcsncpy_s(pTTT->szText, tmpStr, _TRUNCATE);
}
*pResult = 0;
return TRUE;
}
return FALSE;
}
这可能是什么原因?
编辑:如果我把控件的控件ID我希望在其上显示工具提示,它就可以工作并将控件描述显示为文本。如果我在控件所在的资源文件中添加String资源,则字符串资源不会作为工具提示出现。
所以看起来这只是String资源的一个问题?
答案 0 :(得分:1)
在以下代码部分
if( nID == IDC_BUTTON1)
{
GetDlgItemText(IDS_BUTTON1_TT, tmpStr);
_tcsncpy_s(pTTT->szText, tmpStr, _TRUNCATE);
}
看起来您的ID为IDC_BUTTON1
的按钮在资源文件中包含关联的文本字符串,ID为IDS_BUTTON1_TT
。
如果这是真的,那么您需要使用tmpStr.LoadString(IDS_BUTTON1_TT)
来获取文本。除非您需要按钮控件的文本,否则请不要使用GetDlgItemText()
,而是需要使用它的ID IDC_BUTTON1
。所以,这样做
if( nID == IDC_BUTTON1)
{
tmpStr.LoadString(IDS_BUTTON1_TT);
_tcsncpy_s(pTTT->szText, tmpStr, _TRUNCATE);
}