如何在 Windows 7+ 和 MSYS2 上的 GTK3 上获取本机 Windows 装饰
Posted
技术标签:
【中文标题】如何在 Windows 7+ 和 MSYS2 上的 GTK3 上获取本机 Windows 装饰【英文标题】:How to get native windows decorations on GTK3 on Windows 7+ and MSYS2 【发布时间】:2016-08-30 09:01:21 【问题描述】:我正在尝试将我的应用程序从 linux 移植到 Windows,但我遇到了主题问题。在 linux 中,这是开箱即用的,只需编译它,应用程序就会使用好的主题并且看起来很原生。
我已经在 MSYS2 中安装了 gtkmm3 和 gtk3,我正在使用 CMake 构建它。没关系,我必须使用二进制文件将所有 dll 复制到目录才能执行它。我没有复制其他任何东西。我正在尝试创建“解压缩并执行”包。
我的问题是,该应用程序看起来不合适。它看起来根本不是原生的。窗口周围有阴影,这在 Windows10 中很好,但在 Windows 7 中看起来不是原生的。还缺少几个图标。
即使 gitk3-demo 看起来也不是原生的(但它至少有正确的最小化/最大化/关闭图标)。
所以问题是:如何在 Windows 上实现 GTK3 应用程序的原生外观?或者至少是原生的窗饰?
谢谢
【问题讨论】:
@oldtechaa GTK+ 中的 win32 主题内置于 GTK+ 中; C++ 无关紧要。缺少图像是由于图标主题配置错误,与源代码无关。虽然我想知道“标准”标题栏如何没有图标,但 gtk3-demo 使用的 GtkHeaderBar 确实...... 在 msys2 IRC 频道上,raymod2 说:“他需要将图标从 Adwaita 复制到他的二进制文件可以找到它们的位置。我把我的放在一个名为“share”的文件夹中文件夹作为我的应用程序二进制文件。对于他的屏幕截图中缺少的图标,他需要:window-close.png、window-maximize-symbolic.symbolic.png 和 window-minimize-symbolic.symbolic.png 位于 share/icons/ Adwaita/16x16/动作。”希望对您有所帮助。 谢谢@DavidGrayson,这实际上是图标。 肯定有办法做到这一点,因为 MyPaint 有适当的原生窗口装饰(不像下面的假 XP)。但我在代码中找不到他们实际启用它的任何地方。 【参考方案1】:Thera 有两个子问题:缺少图标和设置正确的主题。
缺少图标
对于丢失的图标,复制这些图标就足够了
window-close-symbolic.symbolic.png 窗口最大化-symbolic.symbolic.png 窗口最小化-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
win32 主题内置于 GTK3 中,似乎只需要上一步中的三个图标。
在 Windows 7 上,如下所示:
问题是,即使在 Windows 10 上,装饰看起来也一样(包括窗户装饰)。
来自@andlabs 的评论:GTK+ 3 使用 uxtheme.dll API 来获得它的 Windows 外观和感觉,不幸的是,微软保留了那些类似于 Windows 7 的窗口边框。 (更多内容见 cmets)
您可以在此处查看带有win32
主题的 Windows 10 Gtk3 应用程序:
使用非默认主题
如果您对默认或 win32 主题不满意,您可以使用来自 Internet 的自定义主题(如 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
和文件夹名称应该匹配。
运行可执行文件后,您应该能够获得不同的主题。
编辑:所以内置了一个win32主题,谢谢@andlabs
EDIT2:添加截图
EDIT3:添加了 Windows 10 屏幕截图并更正了事实。
【讨论】:
等等,我还以为win32
主题仍然是 GTK+ 的一部分。不过,我不确定 3.20 是否删除了它。如果您在主题字符串设置为win32
(如上)的情况下运行程序会发生什么?
谢谢,我在阅读您对该问题的评论时不知何故错过了它(我错过了一个事实,即主题是内置的,但不是默认的,并且它有一个名称 win32
)。我编辑了我的答案以更符合现实。 :)
出于好奇,Flat-Pat
和 win32
在上面的示例程序中看起来像什么?
实际上我认为 GTK+ 3 使用 uxtheme.dll API 来获得它的 Windows 外观和感觉,不幸的是微软保留了那些类似于 Windows 7 的窗口边框(尝试任何 MDI Windows 程序来查看)。您可以检查来源以确认这一点。不过,我不确定为什么这些按钮看起来也像 Windows 7...
这看起来不像 Win10-ish。【参考方案2】:
您可以设置 GTK_CSD=0 环境变量来禁用客户端窗口装饰并启用 Windows 原生装饰,从而摆脱丑陋的 win7 和 Adwaita 式标题栏。
【讨论】:
【参考方案3】:实际上,Gtk+3 已与 Windows 10 兼容,您可以通过将其设为默认主题来使用原生 windows 主题。
gtk-theme-name = MS-Windows
【讨论】:
看起来是不是很现代(win10 windows装修)?还是它看起来像 win32 默认主题(win7ish windows 装饰)?我无法访问win10机器,所以我无法测试它。 :( 这在我的 Win10 机器上不起作用。您是从哪里获得这些信息的? 不适用于带有 gtk 3.22 的 win7。这仅适用于 gtk-2.0。来源:mail.gnome.org/archives/gtk-app-devel-list/2010-September/…【参考方案4】:对于像我这样使用 (activestate) perl 的人,/share 和 /etc 需要放在 perl.exe 上方的一个目录中(如果 perl.exe 在 C:\Perl64\bin 中,则在 C:\Perl64 中)。
【讨论】:
【参考方案5】:虽然 GTK_CSD=0 对 Windows 框架图标做得很好,但默认的拖放 (DND) 图标也丢失了。
拖动 GtkEntry 或 GtkTreeView 内容会显示一个拖动图标。
我在 Gtk+-3.24.4 下准备了一个按钮作为拖动源。拖动按钮时,鼠标光标消失并且不显示拖动图标。
当使用 gtk_drag_source_set_icon_pixbuf(bt, pixbuf) 时,pixbuf 显示为拖动图标。但是这样做只完成了一半的工作,因为图标上缺少移动/复制指示符。
【讨论】:
以上是关于如何在 Windows 7+ 和 MSYS2 上的 GTK3 上获取本机 Windows 装饰的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 上将 std::filesystem 与 mingw32-make 和 msys2 一起使用
如何使用 MSYS2 在 Windows 上安装 GTK3 和 minGW