CMFCToolbar和CMFCMenubar显示错误的工具提示

时间:2015-04-22 14:30:47

标签: menu tooltip toolbar menuitem submenu

问题也在https://social.msdn.microsoft.com/Forums/vstudio/en-US/f64c99e5-f490-454f-951f-aee794e9506b/cmfctoolbar-and-cmfcmenubar-displaying-wrong-tooltips

上提出

我正在使用Visual Studio 2010,但我怀疑这个bug仍然存在于2013版本中,因为我比较了两个文件中的winfrm.cpp文件和OnToolTipText完全相同。

错误总是发生在第7,第8或第16个元素。 虽然分隔符计为此计数的元素,但工具提示不会显示在它们上面。

元素可以是文本菜单,POPUP菜单或工具栏按钮。

字符串表定义为:

#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局部变量没有获得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"

1 个答案:

答案 0 :(得分:0)

在更新中,我把一个字符串表格更加类似于我的字符串表格。在7,8和16弦的共同特征之前我没有注意到:它们的内容中都有'\ n'个字符。

我认为没有人会创建超过512个菜单项的菜单,也不会创建超过512个按钮的工具栏,所以我的解决方案是将包含ID为512以下的“\ n”字符的所有字符串更改为512以上的数字。

它有效。