如何在 Windows 7+ 和 MSYS2 的 GTK3 上获得原生 windows 装饰
How to get native windows decorations on GTK3 on Windows 7+ and MSYS2
我正在尝试将我的应用程序从 linux 移植到 windows,但我遇到了主题设置问题。在 linux 中,它开箱即用,只需编译它,应用程序就会使用很好的主题,看起来很原生。
我已经在 MSYS2 中安装了 gtkmm3 和 gtk3,并且正在使用 CMake 构建它。没关系,我必须将所有 dll 复制到二进制目录才能执行它。我没有复制任何其他东西。我正在尝试创建 "unzip and execute" 包。
我的问题是,该应用程序看起来不合适。它看起来一点也不原生。在 window 周围有阴影,在 Windows10 中很好,但在 Windows 7 中看起来不是原生的。还有几个图标丢失了。
即使 gitk3-demo 看起来也不是原生的(但它至少有 minimize/maximize/close 图标是正确的)。
所以问题是:如何在 Windows 上实现 GTK3 应用程序的原生外观?或者至少是原生 window 装饰品?
谢谢
还有两个子问题:缺少图标和设置正确的主题。
缺少图标
如果缺少图标,复制这些图标就足够了
- window-关闭-symbolic.symbolic.png
- window-最大化-symbolic.symbolic.png
- window-最小化-symbolic.symbolic.png
来自:C:\msys64\mingw32\share\icons\Adwaitax22\actions
至:"your executable folder"\share\icons\Adwaitax22\actions
主题
使用 win32 原生主题
实际上GTK3 中有一个内置的native-like 主题。要使用类似原生的主题,只需创建文件 "your executable folder"\etc\gtk-3.0\settings.ini 并将其包含在其中
[Settings]
gtk-theme-name=win32
win32 主题内置于 GTK3 中,似乎只需要上一步中的三个图标。
在 windows 7 上看起来如下:
问题是,即使在 Windows 10(包括 window 装饰)上,装饰看起来也一样。
来自@andlabs 的评论:GTK+ 3 使用 uxtheme.dll API 来获得它的 Windows 外观和感觉,不幸的是微软保留了那些 Windows 7-like for window 边框。 (更多评论)
您可以在此处查看 Windows 10 Gtk3 应用程序 win32
主题:
使用非默认主题
如果您对默认主题或 win32 主题不满意,可以使用来自 Internet 的自定义主题(如 this Flat-Pat)。 :) 为此,您需要创建配置文件:
"your executable folder"\etc\gtk-3.0\settings.ini里面有这个
[Settings]
gtk-theme-name=Flat-Plat
并且您需要将主题文件复制到可执行文件路径中的目录中
"your executable folder"\share\themes\Flat-Plat
在该文件夹中,index.theme
文件和 gtk-x.x
文件夹应该存在。显然 gtk-theme-name
和文件夹名称应该匹配。
在你 运行 可执行文件之后你应该能够得到不同的主题。
编辑:所以有一个内置的 win32 主题,谢谢@andlabs
EDIT2:添加了屏幕截图
EDIT3:添加了 Windows 10 个屏幕截图并更正了事实。
实际上,Gtk+3 与 Windows10 兼容,您可以通过将其设为默认主题来使用本机 windows 主题。
gtk-theme-name = MS-Windows
你可以设置GTK_CSD=0 环境变量来禁用client-side window 装饰并启用Windows 原生装饰,这样可以摆脱丑陋的类似win7 的标题栏, 以及 Adwaita-like 一个。
对于像我这样使用 (activestate) perl 的人,/share 和 /etc 需要放在 perl.exe 之上一个目录(如果 perl.exe 在 C:\Perl64 中C:\Perl64\bin).
虽然 GTK_CSD=0 对 windows 框架图标做得很好,但默认的拖放 (DND) 图标也丢失了。
拖动 GtkEntry 或 GtkTreeView 内容会显示一个拖动图标。
我在Gtk+-3.24.4下准备了一个按钮作为拖拽源。拖动按钮时,鼠标光标消失并且不显示拖动图标。
当使用gtk_drag_source_set_icon_pixbuf(bt, pixbuf) 时,pixbuf 显示为拖动图标。但是这样做只完成了一半的工作,因为图标上缺少 move/copy 指示符。
我正在尝试将我的应用程序从 linux 移植到 windows,但我遇到了主题设置问题。在 linux 中,它开箱即用,只需编译它,应用程序就会使用很好的主题,看起来很原生。
我已经在 MSYS2 中安装了 gtkmm3 和 gtk3,并且正在使用 CMake 构建它。没关系,我必须将所有 dll 复制到二进制目录才能执行它。我没有复制任何其他东西。我正在尝试创建 "unzip and execute" 包。
我的问题是,该应用程序看起来不合适。它看起来一点也不原生。在 window 周围有阴影,在 Windows10 中很好,但在 Windows 7 中看起来不是原生的。还有几个图标丢失了。
即使 gitk3-demo 看起来也不是原生的(但它至少有 minimize/maximize/close 图标是正确的)。
所以问题是:如何在 Windows 上实现 GTK3 应用程序的原生外观?或者至少是原生 window 装饰品?
谢谢
还有两个子问题:缺少图标和设置正确的主题。
缺少图标
如果缺少图标,复制这些图标就足够了
- window-关闭-symbolic.symbolic.png
- window-最大化-symbolic.symbolic.png
- window-最小化-symbolic.symbolic.png
来自:C:\msys64\mingw32\share\icons\Adwaitax22\actions
至:"your executable folder"\share\icons\Adwaitax22\actions
主题
使用 win32 原生主题
实际上GTK3 中有一个内置的native-like 主题。要使用类似原生的主题,只需创建文件 "your executable folder"\etc\gtk-3.0\settings.ini 并将其包含在其中
[Settings]
gtk-theme-name=win32
win32 主题内置于 GTK3 中,似乎只需要上一步中的三个图标。
在 windows 7 上看起来如下:
问题是,即使在 Windows 10(包括 window 装饰)上,装饰看起来也一样。
来自@andlabs 的评论:GTK+ 3 使用 uxtheme.dll API 来获得它的 Windows 外观和感觉,不幸的是微软保留了那些 Windows 7-like for window 边框。 (更多评论)
您可以在此处查看 Windows 10 Gtk3 应用程序 win32
主题:
使用非默认主题
如果您对默认主题或 win32 主题不满意,可以使用来自 Internet 的自定义主题(如 this Flat-Pat)。 :) 为此,您需要创建配置文件:
"your executable folder"\etc\gtk-3.0\settings.ini里面有这个
[Settings]
gtk-theme-name=Flat-Plat
并且您需要将主题文件复制到可执行文件路径中的目录中
"your executable folder"\share\themes\Flat-Plat
在该文件夹中,index.theme
文件和 gtk-x.x
文件夹应该存在。显然 gtk-theme-name
和文件夹名称应该匹配。
在你 运行 可执行文件之后你应该能够得到不同的主题。
编辑:所以有一个内置的 win32 主题,谢谢@andlabs
EDIT2:添加了屏幕截图
EDIT3:添加了 Windows 10 个屏幕截图并更正了事实。
实际上,Gtk+3 与 Windows10 兼容,您可以通过将其设为默认主题来使用本机 windows 主题。
gtk-theme-name = MS-Windows
你可以设置GTK_CSD=0 环境变量来禁用client-side window 装饰并启用Windows 原生装饰,这样可以摆脱丑陋的类似win7 的标题栏, 以及 Adwaita-like 一个。
对于像我这样使用 (activestate) perl 的人,/share 和 /etc 需要放在 perl.exe 之上一个目录(如果 perl.exe 在 C:\Perl64 中C:\Perl64\bin).
虽然 GTK_CSD=0 对 windows 框架图标做得很好,但默认的拖放 (DND) 图标也丢失了。
拖动 GtkEntry 或 GtkTreeView 内容会显示一个拖动图标。
我在Gtk+-3.24.4下准备了一个按钮作为拖拽源。拖动按钮时,鼠标光标消失并且不显示拖动图标。
当使用gtk_drag_source_set_icon_pixbuf(bt, pixbuf) 时,pixbuf 显示为拖动图标。但是这样做只完成了一半的工作,因为图标上缺少 move/copy 指示符。