Vista 工具栏如何忽略或找出边框填充设置?
-
12-09-2019 - |
题
我有一个在旧版本 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 中都运行的应用程序如何处理这个问题呢?我的问题是:
- 工具栏是否可以告诉 Vista“忽略‘边框填充’设置;我的边框填充是0”?
- 如果不是,应用程序如何确定边框填充的设置,以便使其窗口高两倍?
- 对于这两个问题,如何以允许相同的可执行文件在 XP、Vista、Win2003 等下运行的方式做到这一点?
解决方案
一种选择是使用不同的窗口样式,从 WS_THICKFRAME 开始。
要计算填充,请尝试使用 GetClientRect 和 GetWindowRect 并从另一个中减去一个。
其他提示
另一件需要单独注意的事情是,如果您已经尝试使用以下方法来考虑窗口边框 GetSystemMetrics
或类似的,您编译的子系统会影响边界如何影响您的客户区域。
objectmix 上的链接 试图解释这一点。通过子系统,我相信他们的意思是 /subsystem
当您链接时标记 .exe
, ,或 Visual Studio 中的相应设置。
〜珠宝
好吧,我想通了,排序吧。就我而言,问题的原因是使用 WS_THICKFRAME
打电话时 CreateWindowEx()
, ,我不需要。以前,此设置用于将工具栏中的所有内容垂直居中。我想在 WinXP(经典视图)和更早版本下, WS_THICKFRAME
不出所料,在所有尺寸上都添加了 3 个像素的填充。
因此,我删除了该选项并更改了代码,将所有内容向下和向右移动三个像素。现在,工具栏在 WinXP 和 Vista 下看起来相同,并且我没有烦人且不必要的(对于此工具栏)额外填充。
这并不能解决一般情况,但由于我的回答可能会帮助遇到此问题的其他人,所以我想我应该发布我的解决方案。我希望这对其他人有帮助。