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

kra*_*jic 13 gtk gtkmm gtk3 msys2 gtkmm3

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

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

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

Windows10上的坏gtk3应用程序主题

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

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

谢谢

kra*_*jic 12

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

缺少图标

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

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

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

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

主题

使用win32原生主题

在GTK3中实际上有一个内置的原生主题.对于使用天然样的主题只需创建文件"的可执行文件夹" \等\ GTK的3.0 \的Settings.ini本在它

[Settings]
gtk-theme-name=win32
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

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

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

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

在此输入图像描述

使用非默认主题

如果您对默认或win32主题不满意,可以使用互联网上的自定义主题(如此Flat-Pat).:)为了做到这一点,你需要创建配置文件:

"你的可执行文件夹"\ etc\gtk-3.0\settings.ini中有这个

[Settings]
gtk-theme-name=Flat-Plat
Run Code Online (Sandbox Code Playgroud)

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

"您的可执行文件夹"\ share\themes\Flat-Plat

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

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

在此输入图像描述

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

EDIT2:添加了截图

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

  • 等等,我以为有一个'win32`主题仍然是GTK +的一部分.我不确定3.20是否删除了它.如果你运行你的程序主题字符串设置为`win32`(如上所述)会发生什么? (2认同)
  • 实际上我认为GTK + 3使用uxtheme.dll API来获得它的外观和感觉,不幸的是,微软已经保留了类似Windows 7的窗口边框(尝试任何MDI Windows程序).您可以检查来源以确认这一点.我不确定为什么按钮看起来也像Windows 7,但是...... (2认同)
  • 这看起来并不像Win10-ish. (2认同)

小智 6

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