gpt4 book ai didi

gtk - 我如何真正使 GTK+ 3 GtkLayout 透明/绘制主题背景?

转载 作者:行者123 更新时间:2023-12-04 13:54:44 26 4
gpt4 key购买 nike

如果我创建一个内部没有任何内容的普通 GtkWindow 或一个内部带有 GtkDrawingArea 的 GtkWindow(或 GtkScrolledWindow 内部的 GtkWindow),我会得到一个带有主题背景的窗口,如 this picture .

但是如果我使用 GtkLayout,我会得到一个纯色背景的窗口,如 this picture .

到目前为止,任何人(包括我自己)都能找到的唯一资源是 this other Stack Overflow question ,但是当我按照它说的去做时,我会得到一个全黑的背景,就像 this picture ,即使我得到了 GtkLayout 的 bin 窗口的 cairo 上下文。

那么我究竟如何让 GtkLayout 透明,或者如果这不是一个选项,使用主题的背景?

虽然我运行的是 GTK+ 3.10,但我需要针对 GTK+ 3.4,所以 gtk_widget_set_opacity() 将不起作用。我的截图中显示的主题是 gtk-oxygen 主题;我正在使用 KDE。

下面的示例程序。它具有涵盖我上面描述的所有情况的选项。我还在 draw() 中尝试了各种 cairo 调用的变体。 (注释掉一些,在设置 CLEAR 后添加另一个 alpha 颜色选择,而不是设置剪辑矩形等);那也没有用。

谢谢!

/* pietro gagliardi - 7-8 april 2014 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define GDK_VERSION_MIN_REQUIRED GDK_VERSION_3_4
#define GDK_VERSION_MAX_ALLOWED GDK_VERSION_3_4
#include <gtk/gtk.h>

gboolean windowonly = FALSE;
gboolean drawingarea = FALSE;
gboolean viewport = FALSE;
gboolean drawsig = FALSE;
gboolean binwin = FALSE;

void parseargs(int argc, char *argv[])
{
if (argc != 2 && argc != 3)
goto usage;

#define extra(str) (argc == 3 && strcmp(argv[2], str) == 0)
#define noextra(cond) if (!(cond) && argc == 3) goto usage;
if (strcmp(argv[1], "windowOnly") == 0) {
noextra(FALSE);
windowonly = TRUE;
return;
} else if (strcmp(argv[1], "drawingArea") == 0) {
drawingarea = TRUE;
viewport = extra("viewport");
noextra(viewport);
return;
} else if (strcmp(argv[1], "layout") == 0) {
binwin = extra("drawbin");
drawsig = binwin || extra("draw");
noextra(drawsig);
return;
}

usage:
fprintf(stderr, "usage:\n");
fprintf(stderr, "\t%s windowOnly\n", argv[0]);
fprintf(stderr, "\t%s drawingArea [viewport]\n", argv[0]);
fprintf(stderr, "\t%s layout [draw|drawbin]\n", argv[0]);
exit(1);
}

gboolean draw(GtkWidget *widget, cairo_t *cr, gpointer data)
{
double x, y, w, h;

if (binwin)
cr = gdk_cairo_create(gtk_layout_get_bin_window((GtkLayout *) widget));

cairo_clip_extents(cr, &x, &y, &w, &h);
cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
cairo_rectangle(cr, x, y, w, h);
cairo_fill(cr);
cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
cairo_set_source_rgba(cr, 0, 0, 0, 0);
cairo_rectangle(cr, x, y, w, h);
cairo_fill(cr);

if (binwin)
cairo_destroy(cr);

return FALSE;
}

int main(int argc, char *argv[])
{
GtkWidget *w;
GtkWidget *q;

parseargs(argc, argv);
gtk_init(NULL, NULL);

w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(w, "destroy", G_CALLBACK(gtk_main_quit), NULL);

if (!windowonly) {
if (drawingarea) {
q = gtk_drawing_area_new();
if (viewport) {
GtkWidget *sw;

sw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), q);
q = sw;
}
} else {
q = gtk_layout_new(NULL, NULL);
if (drawsig)
g_signal_connect(q, "draw", G_CALLBACK(draw), NULL);
}
gtk_container_add(GTK_CONTAINER(w), q);
}

gtk_widget_show_all(w);

gtk_main();
return 0;
}

最佳答案

添加 GtkCssProvider到您的窗口,其中一个或两个

GtkLayout {
background-color: transparent;
}

GtkViewport {
background-color: transparent;
}

装入其中。您也可以使用 gtk_widget_override_background_color() 执行此操作.

关于gtk - 我如何真正使 GTK+ 3 GtkLayout 透明/绘制主题背景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22940588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com