2009-07-23 6 views

Antwort

2

Für Mac OS X, siehe Beispielcode RoundTransparentWindow. Es funktioniert mit einem benutzerdefinierten vollständig transparenten Fenster und Zeichnungsformen darin. Obwohl das Beispiel nur Formen mit harten Kanten + Gesamt-Alpha verwendet, kann beliebiges Alpha verwendet werden.

Obwohl das Beispiel ein benutzerdefiniertes Fenster verwendet, können Sie die gleiche Technik verwenden, um Löcher in normale Fenster zu stanzen, indem Sie setOpaque:NO aufrufen. Hacky Beispiel:

@implementation ClearView 

- (void)drawRect:(NSRect)rect 
{ 
    if (mask == nil) mask = [[NSImage imageNamed:@"mask"] retain]; 
    [self.window setOpaque:NO]; 
    [mask drawInRect:self.bounds 
      fromRect:(NSRect){{0, 0},mask.size} 
      operation:NSCompositeCopy 
      fraction:1.0]; 
} 

@end 

Die primäre Beschränkung dieser Technik besteht darin, dass die Standard Schlagschatten nicht sehr gut mit alpha-blended Kanten in Wechselwirkung treten.

1

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; 
}