Windows Vista工具栏如何忽略或计算边框填充设置?

Windows Vista工具栏如何忽略或计算边框填充设置?,windows,windows-vista,toolbar,padding,appbar,Windows,Windows Vista,Toolbar,Padding,Appbar,我在旧版本的Windows下开发了一个工具栏,由于新的窗口边框填充,该工具栏在Vista下基本上被切断。默认边框填充为4时,工具栏上的所有内容都向下向右移动四个像素,然后从底部和右侧剪切四个像素。我不太关心水平维度,但垂直维度意味着应用程序会丢失8个像素的可见内容 我所说的“工具栏”是指创建的类似于以下内容的窗口: APPBARDATA AppBarData; AppBarData.hWnd = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST,

我在旧版本的Windows下开发了一个工具栏,由于新的窗口边框填充,该工具栏在Vista下基本上被切断。默认边框填充为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中运行的应用程序如何处理此问题?我的问题是:

  • 工具栏是否可以告诉Vista“忽略“边框填充”设置;我的边框填充为0”
  • 如果没有,应用程序如何计算边框填充设置为什么,从而使其窗口的高度增加两倍
  • 对于这两个问题,您如何以允许相同的可执行文件在XP、Vista、Win2003等环境下运行的方式做到这一点

  • 一个选项是使用不同的窗口样式,从WS_THICKFRAME开始


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

    另一件需要单独注意的事情是,如果您已经尝试使用
    GetSystemMetrics
    或类似工具来考虑窗口边框,您编译的子系统在边界如何影响您的客户区域方面起着重要作用

    试图解释这一点。对于subsystem,我相信它们的意思是当您链接
    .exe
    或Visual Studio中的相应设置时,使用
    /subsystem
    标志


    ~jewels

    好吧,我想出来了,如果有的话。在我的例子中,问题的原因是调用
    CreateWindowEx()
    时使用了
    WS\u THICKFRAME
    ,这是我不需要的。以前,此设置用于将工具栏中的所有内容垂直居中。我想在WinXP(经典视图)和更早的版本下,一个
    WS_THICKFRAME
    可以预见地在所有尺寸上添加了3个像素的填充

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


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

    我从这些链接中发现,如果我使用subsystem minimum version 6.0进行编译,那么应用程序可以成功获得边框大小。这将使它能够补偿边界。但是,应用程序将不会在Vista之前的任何环境下运行,这是不可接受的。一定有办法解决这个问题,但我找不到。不客气。很高兴你明白了。在我的WS_THICKFRAME建议和/或子系统提示之间(虽然这并没有直接帮助你的准确场景,但它是如此微妙,以至于没有其他人会理解它,我很高兴我的评论值为零到负。此外,从非客户区域中减去客户区域,正如我在下面建议的,应该总是有效的。如果不是这样,请将来源发送给我,我会让它发挥作用。一般来说,应用程序开发人员根本不需要处理这个问题——即使是非常微妙的/子系统的事情——除非他们用填充物进行不可靠的手动计算。负面观点不是我说的。我还没有对这些答案投过票。人们出于各种愚蠢和令人惊讶的原因投了反对票。你真不幸你必须在StackOverflow和相关网站上习惯它。