【发布时间】:2015-04-22 14:30:46
【问题描述】:
我使用的是 Visual Studio 2010,但我怀疑该错误在 2013 版本上仍然存在,因为我比较了 winfrm.cpp 文件和 OnToolTipText 在这两个文件上完全相同。
错误总是发生在第 7、8 或 16 个元素上。 尽管分隔符算作此计数的元素,但工具提示不会出现在它们上面。
元素可以是文本菜单项、弹出菜单或工具栏按钮。
字符串表定义为:
#define IDS_SEVEN 7
#define IDS_EIGHT 8
#define IDS_NINE 9
#define IDS_TEN 10
#define IDS_ELEVEN 11
#define IDS_TWELVE 12
#define IDS_THIRTEEN 13
#define IDS_FOURTEEN 14
#define IDS_FIFTEEN 15
#define IDS_SIXTEEN 16
STRINGTABLE 的内容是:
IDS_SEVEN "Seven"
IDS_EIGHT "Eight"
IDS_NINE "Nine"
IDS_TEN "Ten"
IDS_ELEVEN "Eleven"
IDS_TWELVE "Twelve"
IDS_THIRTEEN "Thirteen"
IDS_FOURTEEN "Fourteen"
IDS_FIFTEEN "Fifteen"
IDS_SIXTEEN "Sixteen"
因此,当我将鼠标指针悬停在第 7、第 8 或第 16 个元素上时,我得到一个错误提示,显示具有该 ID 的字符串(例如:第 7 个元素显示“七”)。
我的所有工具栏和所有具有足够数量项目的菜单都会发生这种情况,包括在顶级水平菜单栏中。
我发现有罪功能是:
BOOL CFrameWnd::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
因为nID局部变量获取的不是Command的ABSOLUTE ID,而是按钮的POSITIONAL顺序,从1开始而不是0。
如果我将字符串 ID 移出该范围,则每当用户想要添加新字符串时,Visual Studio 资源编辑器都会看到该空间空闲并使用它,然后再次填充它。而且问题会再次发生。所以,这不是一个有效的解决方案。
我还可以为所有命令定义字符串。但是由于我们同时维护了四个 TFS 分支,并且更改需要转到所有分支,因此在之后进行合并时,这种更改可能非常危险。
那么,请问您推荐什么解决方案来不显示那些愚蠢的工具提示?
更新:我没有完全照原样复制字符串表。是这样的:
IDS_SEVEN "Seven\nSeven"
IDS_EIGHT "Eight\nEight"
IDS_NINE "Nine"
IDS_TEN "Ten"
IDS_ELEVEN "Eleven"
IDS_TWELVE "Twelve"
IDS_THIRTEEN "Thirteen"
IDS_FOURTEEN "Fourteen"
IDS_FIFTEEN "Fifteen"
IDS_SIXTEEN "Sixteen\nSixteen"
【问题讨论】:
标签: menu tooltip toolbar menuitem submenu