使用本机Windows句柄的gtk字体渲染(gtk font rendering using native windows handle)

编程入门 行业动态 更新时间:2024-10-27 15:22:20
使用本机Windows句柄的gtk字体渲染(gtk font rendering using native windows handle)

我使用gtk + 2制作了一个用于渲染文本的小gui应用程序。 在win32上处理可怕的字体。 我正在使用本机窗口句柄(HDC)创建一个cairo表面。 现在,在Windows中字体看起来很漂亮,但看起来画布在绘制操作后没有正确更新,除非我调整窗口大小。 这只发生在win32上。

下面的代码在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; }

我也在寻找您认为合适的任何其他建议。

I made a small gui app for rendering text using gtk+2. To tackle horrible fonts on win32. I am creating a cairo surface using native windows handle (HDC). Now font look beautiful in windows but it appears that canvas do not update correctly after drawing operations unless i resize the window. this happens only on win32.

Below code compiles on linux and win32 both

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

I am also looking for any other suggestions that you might think appropriate.

最满意答案

我发现必须设置解决方案窗口双缓冲

https://people.gnome.org/~federico/misc/gtk-drawing-model/

I found the solution window double buffering must be set off

https://people.gnome.org/~federico/misc/gtk-drawing-model/

更多推荐

本文发布于:2023-07-18 11:37:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1159799.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:句柄   本机   字体   windows   Windows

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!