16

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

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

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

Windows10 上的错误 gtk3 应用程序主题

甚至 gitk3-demo 看起来也不是本机的(但它至少具有正确的最小化/最大化/关闭图标)。

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

谢谢

4

5 回答 5

15

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

缺少图标

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

  • 窗口关闭符号.symbolic.png
  • 窗口最大化-symbolic.symbolic.png
  • 窗口最小化-symbolic.symbolic.png

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

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

主题

使用win32原生主题

在 GTK3 中实际上有一个内置的类原生主题。要使用类似本机的主题,只需在其中创建文件“您的可执行文件夹”\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 的窗口边框。(更多评论见)

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

在此处输入图像描述

使用非默认主题

如果您对默认主题或 win32 主题不满意,您可以使用来自 Internet的自定义主题(例如这个 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 屏幕截图并更正了事实。

于 2016-05-05T21:14:15.590 回答
6

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

于 2017-06-15T18:17:57.343 回答
0

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

gtk-theme-name = MS-Windows
于 2016-10-25T11:45:13.803 回答
0

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

于 2019-02-07T07:53:57.747 回答
0

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

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

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

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

于 2019-03-10T11:57:12.727 回答