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

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

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 等下运行的方式做到这一点?
有帮助吗?

解决方案

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

要计算填充,请尝试使用 GetClientRect 和 GetWindowRect 并从另一个中减去一个。

其他提示

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

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

〜珠宝

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top