如何在Windows 7+和MSYS2上的GTK3上获取本机Windows装饰

问题描述 投票:13回答:5

我试图将我的应用程序从linux移植到Windows,我有一个主题问题。在Linux中,这是一个盒子,只需编译它,应用程序使用良好的主题,看起来像本机。

我在MSYS2中安装了gtkmm3和gtk3,我正在用CMake构建它。这没关系,我不得不将所有dll复制到二进制目录以便能够执行它。我没有复制任何其他内容。我正在尝试创建“解压缩和执行”包。

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

bad gtk3 application theme on Windows10

甚至gitk3-demo也以相同的方式看起来非原生(但它至少有最小化/最大化/关闭图标正确)。

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

谢谢

gtk gtk3 gtkmm msys2 gtkmm3
5个回答
12
投票

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

Missing icons

对于缺少图标,只需复制这些图标即可

  • 窗口关闭,symbolic.symbolic.png
  • 窗口最大化,symbolic.symbolic.png
  • 窗口最小化,symbolic.symbolic.png

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

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

Theme

使用win32原生主题

在GTK3中实际上有一个内置的原生主题。对于使用类似本机的主题,只需在其中创建文件“您的可执行文件夹”\ etc \ gtk-3.0 \ settings.ini

[Settings]
gtk-theme-name=win32

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

在Windows 7上,这看起来如下:

enter image description here

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

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

你可以在这里看到带有win32主题的Windows 10 Gtk3应用程序:

enter image description here

使用非默认主题

如果您对默认或win32主题不满意,可以使用互联网上的自定义主题(如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和文件夹名称应该匹配。

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

enter image description here

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

EDIT2:添加了截图

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


4
投票

您可以设置GTK_CSD = 0环境变量来禁用客户端窗口装饰并启用Windows本机装饰,这样可以摆脱丑陋的win7式标题栏以及类似Adwaita的标题栏。


0
投票

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


0
投票

虽然GTK_CSD = 0正在为Windows框架图标做得很好,但是接缝默认拖放(DND)图标也丢失了。

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

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

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


-1
投票

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

gtk-theme-name = MS-Windows
© www.soinside.com 2019 - 2024. All rights reserved.