CMFCToolbar 和 CMFCMenubar 显示错误的工具提示
CMFCToolbar and CMFCMenubar displaying wrong tooltips
上提出
我使用的是 Visual Studio 2010,但我怀疑该错误仍然存在于 2013 版本中,因为我比较了 winfrm.cpp 文件并且两个文件的 OnToolTipText 完全相同。
错误总是发生在第 7、8 或 16 个元素。
虽然分隔符算作此计数的元素,但工具提示不会出现在它们上面。
元素可以是文本 MENUITEM、POPUP 菜单或工具栏按钮。
字符串table定义为:
#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 个元素显示 "Seven")。
我所有的工具栏和菜单都有足够数量的项目,包括在顶层水平菜单栏中。
我发现有罪的函数是:
BOOL CFrameWnd::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
因为 nID 局部变量获取的不是命令的绝对 ID,而是按钮的位置顺序,从 1 而不是 0 开始。
如果我将字符串 ID 移出该范围,每当用户想要添加新字符串时,Visual Studio 资源编辑器就会看到 space 空闲并使用它,再次填充它.而且问题会再次发生。所以,这不是一个有效的解决方案。
我还可以为所有命令定义字符串。但是由于我们同时维护了4个TFS分支,而且修改需要到所有分支,所以这个修改在之后合并的时候会非常危险。
那么,请问您推荐什么解决方案来不显示那些愚蠢的工具提示?
UPDATE:我没有原样复制字符串 table。是这样的:
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"
在更新中,我放置了一个与我拥有的更相似的字符串表。我以前没有注意到第 7、8 和 16 个字符串的一个共同特征:它们的内容中都有 '\n' 个字符。
我认为没有人会创建包含超过 512 个菜单项的菜单或包含超过 512 个按钮的工具栏,因此我的解决方案是将所有包含 ID 低于 512 的 '\n' 字符的字符串更改为高于 512 的数字。
而且有效。
我使用的是 Visual Studio 2010,但我怀疑该错误仍然存在于 2013 版本中,因为我比较了 winfrm.cpp 文件并且两个文件的 OnToolTipText 完全相同。
错误总是发生在第 7、8 或 16 个元素。 虽然分隔符算作此计数的元素,但工具提示不会出现在它们上面。
元素可以是文本 MENUITEM、POPUP 菜单或工具栏按钮。
字符串table定义为:
#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 个元素显示 "Seven")。
我所有的工具栏和菜单都有足够数量的项目,包括在顶层水平菜单栏中。
我发现有罪的函数是:
BOOL CFrameWnd::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
因为 nID 局部变量获取的不是命令的绝对 ID,而是按钮的位置顺序,从 1 而不是 0 开始。
如果我将字符串 ID 移出该范围,每当用户想要添加新字符串时,Visual Studio 资源编辑器就会看到 space 空闲并使用它,再次填充它.而且问题会再次发生。所以,这不是一个有效的解决方案。
我还可以为所有命令定义字符串。但是由于我们同时维护了4个TFS分支,而且修改需要到所有分支,所以这个修改在之后合并的时候会非常危险。
那么,请问您推荐什么解决方案来不显示那些愚蠢的工具提示?
UPDATE:我没有原样复制字符串 table。是这样的:
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"
在更新中,我放置了一个与我拥有的更相似的字符串表。我以前没有注意到第 7、8 和 16 个字符串的一个共同特征:它们的内容中都有 '\n' 个字符。
我认为没有人会创建包含超过 512 个菜单项的菜单或包含超过 512 个按钮的工具栏,因此我的解决方案是将所有包含 ID 低于 512 的 '\n' 字符的字符串更改为高于 512 的数字。
而且有效。