CStatusBarCtrl GetItemRect XP Manifest

时间:2009-03-10 04:25:50

标签: c++ mfc

在MFC中使用CStatusBarCtrl时,我使用GetItemRect来获取CStatusBar中每个项目的边界。

但是我现在看到一个问题,我在exe中使用了XP清单。它不会返回正确的矩形,因此当鼠标位于控件的最右侧时,我不再正确识别。

可以使用以下方法测试问题:

GetStatusBarCtrl().SetTipText(n - 1, _T("Test"));

创建CStatusBarCtrl并使用SetPaneInfo创建窗格并且文本设置如上所示,当您将鼠标悬停在最右侧窗格上时,提示文本将不可见。

已报告此问题elsewhere。但是没有得到满意的答案。

我需要一个解决方案或解决方案会很棒。

1 个答案:

答案 0 :(得分:0)

我的第一个猜测是Vista和XP中'THEMES'之间的差异。请记住,如果您使用的是CFrameWnd,则会在状态栏最右侧的最后一个窗格中显示一个抓取器控件。因此,看起来ComCtl32.dll中的更改可能会解释这一点,从而为您提供更小的矩形。我假设你只是看到比你之前更小的rect.Width()?你不是在同时谈论较小的X和Y吗?

如果必须,您可能需要查找正确的版本并将其与您的应用一起部署,或者让您的清单反映使用哪个版本...

抱歉,我没有明确的答案,但主题是唯一想到的,因为如果我没记错,在VC6中,抓手被添加到状态栏的顶部,或者状态栏是缩小到足以显示它......

您可以使用的一个建议是检测您正在运行的Windows版本,并假设操作系统的抓手。抓取器的大小与VScroll条的大小相同,因此您可以在运行时自然地从最后一个单元格中移除那么多DLU(或像素),并基于此渲染文本。我将不得不回家并启动VC6,并根据你在这里所说的内容看看它是如何起作用的......

我没有Vista VM方便看看它默认安装了什么版本的ComCtl32.dll,但我猜他们会在其中加入一些代码来处理抓取器。

如果你有完整的示例代码,这对我来说也会让事情变得更轻松......否则,我必须开始挖掘所有旧的VC6生成的代码并从那里开始...

一个有趣的测试是在我们认为可能对此产生影响的部分调用GetSystemMetrics,并了解它们在不同系统之间的差异。如果您将Vista置于“Windows经典”模式,您是否仍会看到相同的结果?

另外,哪台机器是您的开发箱? Vista还是XP?