1

我有一个在旧版本的 Windows 下开发的工具栏,由于窗口新的边框填充,它在 Vista 下很大程度上被切断了。使用默认的 4 边框填充,工具栏上的所有内容都向下和向右移动 4 个像素,然后从底部和右侧将所有内容裁剪 4 个像素。我不太关心水平尺寸,但垂直这意味着应用程序丢失了 8 个像素的可见内容。

“工具栏”是指创建类似于以下内容的窗口:

APPBARDATA  AppBarData;
AppBarData.hWnd = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, MAIN_WNDCLASS,
                                 "", WS_POPUP | WS_THICKFRAME | WS_CLIPCHILDREN,
                                 0, 0, 400, TOOLBAR_HEIGHT, NULL, NULL,
                                 AppInstance, NULL);
// more initialization  ....
SHAppBarMessage(ABM_NEW, &AppBarData);

由于边框填充对于 Vista 来说似乎是一个新的配置项,在 XP 和 Vista 中运行的应用程序如何处理这个问题?我的问题是:

  1. 工具栏是否可以告诉 Vista“忽略'边框填充'设置;我的边框填充为 0”?
  2. 如果不是,应用程序如何确定边框填充设置的值,以便它可以使其窗口高出两倍?
  3. 对于这两个问题,您如何以允许相同的可执行文件在 XP、Vista、Win2003 等系统下运行的方式做到这一点?
4

3 回答 3

1

一种选择是使用不同的窗口样式,从 WS_THICKFRAME 开始。

找出填充尝试使用 GetClientRect 和 GetWindowRect 并从另一个中减去一个。

于 2009-07-09T03:13:02.437 回答
1

GetSystemMetrics另一件需要单独注意的事情是,如果您已经尝试通过使用或类似方法考虑窗口边框,那么您编译的子系统会影响边框如何影响您的客户区。

objectmix 上的链接试图解释这一点。通过子系统,我相信它们的意思是/subsystem链接时的标志.exe,或 Visual Studio 中的相应设置。

〜珠宝

于 2009-07-09T03:25:55.643 回答
0

好吧,我想通了,排序如果。就我而言,问题的原因是使用WS_THICKFRAMEwhen call CreateWindowEx(),我不需要。以前,此设置用于将工具栏中的所有内容垂直居中。我猜在 WinXP(经典视图)和更早的版本下,可以WS_THICKFRAME预见地在所有尺寸上添加了 3 个像素的填充。

因此,我删除了该选项并更改了代码以将所有内容向下和向右移动三个像素。现在工具栏在 WinXP 和 Vista 下看起来相同,我没有烦人和不必要的(对于这个工具栏)额外的填充。

这并不能解决一般情况,但是由于我的回答可能会帮助遇到此问题的其他人,因此我想我会发布我的解决方案。我希望这对其他人有帮助。

于 2009-07-10T00:34:42.933 回答