2014-02-16 21 views
0

我做了一個小的GUI應用程序來渲染文本使用gtk + 2。在win32上處理可怕的字體。我正在使用本機窗口句柄(HDC)創建一個cairo表面。現在字體在窗口中看起來很漂亮,但是看起來畫布在繪製操作後沒有正確更新,除非我調整窗口的大小。這隻發生在win32上。gtk字體使用本地窗口句柄渲染

下面的代碼編譯的Linux和Win32都

#include <iostream> 
#include <gtk/gtk.h> 
#include <unistd.h> 

#ifdef WIN32 
#include <cairo-win32.h> 
#include <gdk/gdkwin32.h> 
#include <pango/pangowin32.h> 
#include <windows.h> 
#endif 

using namespace std; 

GtkWidget* drgArea; 
GtkWidget* window; 

int x = 0; 
int y = 0; 
string text = "click on this window"; 

void on_mouse_down(GtkWidget *widget, GdkEventButton *event, gpointer data) { 
    x = event->x; 
    y = event->y; 
    gtk_widget_queue_draw(drgArea); 
} 

gboolean on_draw(GtkWidget *widget, GdkEventExpose *event, gpointer data) { 
    cout << "on_draw=" << widget << endl; 

    cairo_t* cr; 
    PangoLayout* layout; 
    PangoContext* pangoContext; 
    GdkGC* gc; 

#ifdef CAIRO_HAS_WIN32_SURFACE 
    gc = gdk_gc_new(widget->window); 
    HDC hdc = gdk_win32_hdc_get(widget->window, gc, GDK_GC_SUBWINDOW); 
    cairo_surface_t* cairo_win_surf; 
    cairo_win_surf = cairo_win32_surface_create (hdc); 
    cr = cairo_create(cairo_win_surf); 

#else 
    cr = gdk_cairo_create(widget->window); 
#endif 

    pangoContext = pango_cairo_create_context(cr); 
    layout = pango_layout_new(pangoContext); 
    pango_layout_set_text(layout, (const char*) text.c_str(), text.size()); 
    cairo_set_source_rgb(cr, 0, 0, 0); 
    cairo_move_to(cr, x, y); 
    pango_cairo_show_layout(cr, layout); 
    cairo_destroy(cr); 

#ifdef CAIRO_HAS_WIN32_SURFACE 
    gdk_win32_hdc_release(widget->window, gc, GDK_GC_SUBWINDOW); 
#endif 

    return TRUE; 
} 

int main(int argc, char** argv) { 
    cout << "**** main ****" << endl; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    drgArea = gtk_drawing_area_new(); 
    gtk_widget_set_events(drgArea, 
      GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK 
        | GDK_BUTTON_RELEASE_MASK); 

    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 
    gtk_widget_set_size_request(window, 400, 300); 
    gtk_container_add(GTK_CONTAINER(window), drgArea); 
    gtk_widget_show_all(window); 

    g_signal_connect(drgArea, "button-press-event", G_CALLBACK(on_mouse_down), 
      NULL); 
    g_signal_connect(drgArea, "expose-event", G_CALLBACK(on_draw), NULL); 

    gtk_main(); 
    return 0; 
} 

我還找你可能會認爲適當的任何其他建議。

+0

看來,圖紙被刪除立即被吸引後, –

回答