Ich habe diesen Code in meinem Experiment Ordner von Anfang des Jahres gefunden. Ich kann mich nicht erinnern, wie viel davon ich geschrieben habe und wie viel auf Beispielen von anderswo im Internet basiert.
In diesem Beispiel wird ein teiltransparentes blaues Fenster mit einer vollständig opaken GTK + -Schaltfläche in der Mitte angezeigt. Wenn Sie zum Beispiel ein alphanumerisches PNG irgendwo innerhalb des Fensters zeichnen, sollte dies dazu führen, dass es korrekt zusammengesetzt wird. Hoffentlich bringt dich das auf den richtigen Weg.
Kompilieren sie mit folgendem:
$ gcc `pkg-config --cflags --libs gtk+-2.0` -o per-pixel-opacity per-pixel-opacity.c
Jetzt für den Code:
#include <gtk/gtk.h>
static gboolean on_window_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
cairo_t *cr;
cr = gdk_cairo_create(widget->window); // create cairo context
cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 0.2);
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); // set drawing compositing operator
// SOURCE -> replace destination
cairo_paint(cr); // paint source
cairo_destroy(cr);
return FALSE;
}
gint main(gint argc, gchar **argv)
{
GtkWidget *window, *button, *vbox;
GdkScreen *screen;
GdkColormap *colormap;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), "delete-event", gtk_main_quit, NULL);
g_signal_connect(G_OBJECT(window), "expose-event", G_CALLBACK(on_window_expose_event), NULL);
gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
gtk_container_set_border_width(GTK_CONTAINER(window), 20);
gtk_widget_set_app_paintable(window, TRUE);
screen = gtk_widget_get_screen(window);
colormap = gdk_screen_get_rgba_colormap(screen);
gtk_widget_set_colormap(window, colormap);
button = gtk_button_new();
gtk_button_set_label(GTK_BUTTON(button), "Don't Press!");
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(button));
gtk_widget_show_all(window);
gtk_main();
return 0;
}