2014-02-16 2 views
0

Я сделал небольшое приложение gui для рендеринга текста с использованием gtk + 2. Чтобы устранить ужасные шрифты на win32. Я создаю поверхность каира, используя собственный дескриптор окон (HDC). Теперь шрифт выглядит красиво в окнах, но кажется, что холст не корректно обновляется после операций рисования, если я не изменю размер окна. это происходит только на 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

кажется, что рисунок стирается сразу после того, как обращается –

ответ

Смежные вопросы