2009-07-23 2 views

답변

2

Mac OS X의 경우 RoundTransparentWindow 샘플 코드를 참조하십시오. 그것은 완전히 투명 한 커스텀 윈도우를 사용하고 그 안에 도형을 그려서 작동합니다. 이 예제에서는 단단한 가장자리 + 전체 알파가있는 모양 만 사용하지만 임의의 알파를 사용할 수 있습니다.

이 예제에서는 사용자 지정 창을 사용하지만 setOpaque:NO을 호출하여 동일한 기술을 사용하여 일반 창에서 구멍을 펀칭 할 수 있습니다. Hacky example :

@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 

이 기술의 주요 한계는 표준 드롭 섀도우가 알파 블렌딩 된 가장자리와 아주 잘 상호 작용하지 않는다는 것입니다.

1

올해 초 실험 폴더에이 코드가 있습니다. 나는이 책을 얼마나 많이 쓰고 얼마나 많은 정보를 인터넷의 다른 곳에서 얻었는지를 기억하지 못한다.

이 예제는 완전히 불투명 한 GTK + 버튼이 중앙에있는 부분적으로 투명한 청색 윈도우를 표시합니다. 예를 들어, 창 안의 알파 블렌딩 된 PNG를 그리면 올바르게 합성됩니다. 바라기를 이것은 당신을 바른 길로 인도 할 것입니다.

다음으로 컴파일 :

$ gcc `pkg-config --cflags --libs gtk+-2.0` -o per-pixel-opacity per-pixel-opacity.c 

를 이제 코드 :

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