【问题标题】:How to get native windows decorations on GTK3 on Windows 7+ and MSYS2如何在 Windows 7+ 和 MSYS2 上的 GTK3 上获取本机 Windows 装饰
【发布时间】:2016-08-30 09:01:21
【问题描述】:

我正在尝试将我的应用程序从 linux 移植到 Windows,但我遇到了主题问题。在 linux 中,这是开箱即用的,只需编译它,应用程序就会使用好的主题并且看起来很原生。

我已经在 MSYS2 中安装了 gtkmm3 和 gtk3,我正在使用 CMake 构建它。没关系,我必须使用二进制文件将所有 dll 复制到目录才能执行它。我没有复制其他任何东西。我正在尝试创建“解压缩并执行”包。

我的问题是,该应用程序看起来不合适。它看起来根本不是原生的。窗口周围有阴影,这在 Windows10 中很好,但在 Windows 7 中看起来不是原生的。还缺少几个图标。

即使 gitk3-demo 看起来也不是原生的(但它至少有正确的最小化/最大化/关闭图标)。

所以问题是:如何在 Windows 上实现 GTK3 应用程序的原生外观?或者至少是原生的窗饰?

谢谢

【问题讨论】:

  • @oldtechaa GTK+ 中的 win32 主题内置于 GTK+ 中; C++ 无关紧要。缺少图像是由于图标主题配置错误,与源代码无关。虽然我想知道“标准”标题栏如何没有图标,但 gtk3-demo 使用的 GtkHeaderBar 确实......
  • 在 msys2 IRC 频道上,raymod2 说:“他需要将图标从 Adwaita 复制到他的二进制文件可以找到它们的位置。我把我的放在一个名为“share”的文件夹中文件夹作为我的应用程序二进制文件。对于他的屏幕截图中缺少的图标,他需要:window-close.png、window-maximize-symbolic.symbolic.png 和 window-minimize-symbolic.symbolic.png 位于 share/icons/ Adwaita/16x16/动作。”希望对您有所帮助。
  • 谢谢@DavidGrayson,这实际上是图标。
  • 肯定有办法做到这一点,因为 MyPaint 有适当的原生窗口装饰(不像下面的假 XP)。但我在代码中找不到他们实际启用它的任何地方。

标签: gtk gtk3 gtkmm msys2 gtkmm3


【解决方案1】:

Thera 有两个子问题:缺少图标和设置正确的主题。

缺少图标

对于丢失的图标,复制这些图标就足够了

  • window-close-symbolic.symbolic.png
  • 窗口最大化-symbolic.symbolic.png
  • 窗口最小化-symbolic.symbolic.png

来自:C:\msys64\mingw32\share\icons\Adwaita\22x22\actions

到:“您的可执行文件夹”\share\icons\Adwaita\22x22\actions

主题

使用win32原生主题

在 GTK3 中实际上有一个内置的类原生主题。要使用类原生主题,只需在其中创建文件 "your executable folder"\etc\gtk-3.0\settings.ini

[Settings]
gtk-theme-name=win32

win32 主题内置于 GTK3 中,似乎只需要上一步中的三个图标。

在 Windows 7 上,如下所示:

问题是,即使在 Windows 10 上,装饰看起来也一样(包括窗户装饰)。

来自@andlabs 的评论:GTK+ 3 使用 uxtheme.dll API 来获得它的 Windows 外观和感觉,不幸的是,微软保留了那些类似于 Windows 7 的窗口边框。 (更多内容见 cmets)

您可以在此处查看带有win32 主题的 Windows 10 Gtk3 应用程序:

使用非默认主题

如果您对默认或 win32 主题不满意,您可以使用来自 Internet 的自定义主题(如 this Flat-Pat)。 :) 为此,您需要创建配置文件:

“你的可执行文件夹”\etc\gtk-3.0\settings.ini 里面有这个

[Settings]
gtk-theme-name=Flat-Plat

您需要将主题文件复制到可执行文件路径中的目录

“你的可执行文件夹”\share\themes\Flat-Plat

在该文件夹中,应该存在index.theme 文件和gtk-x.x 文件夹。显然gtk-theme-name 和文件夹名称应该匹配。

运行可执行文件后,您应该能够获得不同的主题。

编辑:所以内置了一个win32主题,谢谢@andlabs

EDIT2:添加截图

EDIT3:添加了 Windows 10 屏幕截图并更正了事实。

【讨论】:

  • 等等,我还以为win32 主题仍然是 GTK+ 的一部分。不过,我不确定 3.20 是否删除了它。如果您在主题字符串设置为win32(如上)的情况下运行程序会发生什么?
  • 谢谢,我在阅读您对该问题的评论时不知何故错过了它(我错过了一个事实,即主题是内置的,但不是默认的,并且它有一个名称 win32)。我编辑了我的答案以更符合现实。 :)
  • 出于好奇,Flat-Patwin32 在上面的示例程序中看起来像什么?
  • 实际上我认为 GTK+ 3 使用 uxtheme.dll API 来获得它的 Windows 外观和感觉,不幸的是微软保留了那些类似于 Windows 7 的窗口边框(尝试任何 MDI Windows 程序来查看)。您可以检查来源以确认这一点。不过,我不确定为什么这些按钮看起来也像 Windows 7...
  • 这看起来不像 Win10-ish。
【解决方案2】:

您可以设置 GTK_CSD=0 环境变量来禁用客户端窗口装饰并启用 Windows 原生装饰,从而摆脱丑陋的 win7 和 Adwaita 式标题栏。

【讨论】:

    【解决方案3】:

    实际上,Gtk+3 已与 Windows 10 兼容,您可以通过将其设为默认主题来使用原生 windows 主题。

    gtk-theme-name = MS-Windows
    

    【讨论】:

    • 看起来是不是很现代(win10 windows装修)?还是它看起来像 win32 默认主题(win7ish windows 装饰)?我无法访问win10机器,所以我无法测试它。 :(
    • 这在我的 Win10 机器上不起作用。您是从哪里获得这些信息的?
    • 不适用于带有 gtk 3.22 的 win7。这仅适用于 gtk-2.0。来源:mail.gnome.org/archives/gtk-app-devel-list/2010-September/…
    【解决方案4】:

    对于像我这样使用 (activestate) perl 的人,/share 和 /etc 需要放在 perl.exe 上方的一个目录中(如果 perl.exe 在 C:\Perl64\bin 中,则在 C:\Perl64 中)。

    【讨论】:

      【解决方案5】:

      虽然 GTK_CSD=0 对 Windows 框架图标做得很好,但默认的拖放 (DND) 图标也丢失了。

      拖动 GtkEntry 或 GtkTreeView 内容会显示一个拖动图标。

      我在 Gtk+-3.24.4 下准备了一个按钮作为拖动源。拖动按钮时,鼠标光标消失并且不显示拖动图标。

      当使用 gtk_drag_source_set_icon_pixbuf(bt, pixbuf) 时,pixbuf 显示为拖动图标。但是这样做只完成了一半的工作,因为图标上缺少移动/复制指示符。

      【讨论】:

        猜你喜欢
        • 2016-07-14
        • 2017-10-18
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        • 2011-09-17
        • 2013-01-07
        • 2017-10-08
        • 2023-04-06
        相关资源
        最近更新 更多