【问题标题】:How do I ask Windows for the size of system tray icons?如何向 Windows 询问系统托盘图标的大小?
【发布时间】:2010-10-08 18:23:43
【问题描述】:

我注意到我的应用程序将图标发送到大小为 16x16 像素的 Windows 托盘 - 而我的 Vista PC 我有一个双宽任务栏,似乎以 18x18 显示图标。我的应用程序图标上调整大小的工件看起来很糟糕。如何询问 Windows 图标的大小?

编辑:

我正在动态生成图标,并带有像素字体文本覆盖。动态生成一堆图标大小似乎很浪费,因此最好避免构建具有所有“可能”大小的图标(我什至不确定它们是什么)。

GetSystemMetrics(SM_CXSMICON) 返回 16——不正确的值。

GetThemeBackgroundContentRect 也没有帮助。

【问题讨论】:

    标签: windows winapi taskbar system-tray


    【解决方案1】:

    创建多种格式的图标,让 Windows 选择它想要的一种。

    Here's the Wikipedia article on the .ico format.

    如果你真的需要知道,GetSystemMetrics 带有参数 SM_CXICON 或 SM_CYICON 会告诉你 Windows 想要加载的宽度和高度。

    【讨论】:

    • 这个答案的前半部分是错误的。通知图标的 API 是Shell_NotifyIcon。这会收到一个NOTIFYICONDATA,其中包含一个HICON。现在,HICON 指的是单个图标,因此您必须在调用Shell_NotifyIcon 之前确定大小。不过最后一段是准确的。
    【解决方案2】:

    Mark 的核心答案是正确的:创建多种格式的图标并让 Windows 选择正确的一种。不要忘记为 HighDPI 场景制作 32x32 和 64x64 图标。

    但 SM_CXICON/SM_CYICON 不一定会返回将在任务栏中使用的大小。任务栏为其大小选择正确的图标大小(这在 Window 7 中非常更重要)。

    只要提供适当大小的图标就可以了。

    【讨论】:

    • 我想我应该提到:我正在动态生成图标,并带有像素字体文本覆盖。动态生成一堆图标大小似乎很浪费。 GetSystemMetrics(SM_CXSMICON) 返回 16——又是不正确的值。
    • 不幸的是,这些信息并没有改变我的答案——您仍然需要生成多个图标大小。或者只是生成一个 256x256 的图标,然后让系统为您缩小它。
    • 不幸的是,当图标重新采样为 16x16 时,使用像素字体生成 256x256 会导致无法阅读的文本。
    • @Larry 对于通知区图标,如何“让Windows选对”?
    • 这个答案是错误的。通知图标的 API 是 Shell_NotifyIcon。收到一个NOTIFYICONDATA,其中包含一个HICON。现在,HICON 指的是单个图标,因此您必须在调用 Shell_NotifyIcon 之前确定大小。
    【解决方案3】:

    您最好的选择可能是 GetThemeBackgroundContentRect 传递 TBN_BACKGROUND 作为托盘通知背景的 iPartId。

    GetThemeBackgroundContentRect 应该返回由当前主题定义的大小,可用于绘制而不重叠父元素的边框。如果我没看错的话,那将是允许的最大通知图标尺寸,并且可能是正在使用的尺寸。

    使用多个 DPI 设置进行测试可能是判断这是否返回正确值的最简单方法。

    【讨论】:

    • 带有 TBN_BACKGROUND 的 GetThemeBackgroundContentRect 也不会随着托盘图标大小的变化而变化。
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多