Gtk 如何在Windows7+;和MSYS2

Gtk 如何在Windows7+;和MSYS2,gtk,gtk3,gtkmm,msys2,gtkmm3,Gtk,Gtk3,Gtkmm,Msys2,Gtkmm3,我正在尝试将我的应用程序从linux移植到windows,但我在主题设置方面遇到了问题。在linux中,这是开箱即用的,只需编译它,应用程序就会使用良好的主题,并且看起来是本地的 我已经在MSYS2中安装了gtkmm3和gtk3,我正在使用CMake构建它。这没关系,我必须用二进制文件将所有DLL复制到目录才能执行它。我没有复制任何其他内容。我正在尝试创建“解压并执行”包 我的问题是,该应用程序看起来不合适。它看起来一点也不土生土长。窗口周围有阴影,这在Windows10中很好,但在Window

我正在尝试将我的应用程序从linux移植到windows,但我在主题设置方面遇到了问题。在linux中,这是开箱即用的,只需编译它,应用程序就会使用良好的主题,并且看起来是本地的

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

我的问题是,该应用程序看起来不合适。它看起来一点也不土生土长。窗口周围有阴影,这在Windows10中很好,但在Windows7中它看起来不是本地的。还有几个图标丢失了

即使是gitk3演示也以同样的方式显示为非本地的(但它至少有正确的最小化/最大化/关闭图标)

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


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

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

  • window-close-symbol.symbol.png
  • window-maximize-symbol.symbol.png
  • window-minimize-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
[Settings]
gtk-theme-name=Flat-Plat
win32主题内置于GTK3中,似乎只需要上一步中的三个图标

在windows 7上,如下所示:

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

来自@andlabs的评论:GTK+3使用uxtheme.dll API来获得其Windows外观,不幸的是,Microsoft保留了类似Windows 7的窗口边框。(更多评论)

您可以在此处看到主题为win32的Windows 10 Gtk3应用程序:

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

“您的可执行文件文件夹”\etc\gtk-3.0\settings.ini,其中包含此文件

[Settings]
gtk-theme-name=win32
[Settings]
gtk-theme-name=Flat-Plat
您需要将主题文件复制到可执行文件路径中的目录中

“您的可执行文件夹”\share\themes\Plat

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

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

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

编辑2:添加屏幕截图


编辑3:添加了Windows10屏幕截图并更正了事实

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

gtk-theme-name = MS-Windows

您可以将GTK_CSD=0环境变量设置为禁用客户端窗口装饰,并启用Windows本机装饰,这样可以消除丑陋的win7类标题栏和Adwaita类标题栏。

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

虽然GTK_CSD=0在windows框架图标方面做得很好,但默认拖放(DND)图标也丢失了

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

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


使用gtk_拖动_源_设置_图标_pixbuf(bt,pixbuf)时这样做只是工作的一半,因为在图标上缺少移动/复制指示符。

@ OrdTeCha。GTK+中的Win32主题被内置到GTK+中;C++是不相关的。由于缺少配置的图标主题,图像的缺乏与源代码无关。尽管我想知道“标准”是如何的。titlebar没有图标,但gtk3演示使用的GtkHeaderBar有…在msys2 IRC频道上,raymod2说:“他需要将图标从Adwaita复制到二进制文件可以找到的位置。我把我的放在一个名为“共享”的文件夹中“与我的应用程序二进制文件位于同一文件夹中。对于他的屏幕截图中缺少的图标,他需要:window-close.png、window-maximize-symbol.symbol.png和window-minimize-symbol.symbol.png位于share/icons/Adwaita/16x16/actions中。”。“希望这能有所帮助。谢谢@DavidGrayson,这实际上就是图标。肯定有办法做到这一点,因为MyPaint有合适的本机windows装饰(不像下面的假XP装饰)。但是我在代码中找不到任何地方可以真正启用它。等等,我以为有一个
win32
主题仍然是GTK+的一部分。但是我不确定3.20是否删除了它。如果在运行程序时将主题字符串设置为
win32
(如上所述),会发生什么情况?谢谢,当我读到你对这个问题的评论时,不知怎的错过了它(我错过了一个事实,主题是内置的,但不是默认的,并且它有一个名称
win32
)。出于好奇,我编辑了我的答案,以便更符合现实,上面的示例程序的
Flat-Pat
win32
是什么样子的?事实上,我认为GTK+3使用uxtheme.dll API来获得其Windows外观,不幸的是,Microsoft将这些Windows 7-like保留为窗口边框(请尝试任何MDI Windows程序查看)。您可以检查来源以确认这一点。我不知道为什么按钮看起来也像Windows7,虽然…这看起来不像Win10-ish。它看起来现代吗(wi