在這個簡單的示例中,函式 do_drawcairo 內部知道要在哪個表面上繪制,因為它使用了引數cairo_t * cr。我不明白cr從哪里來,我想它是由 GTK 通過創建小部件自動創建的drawarea。
我想cr從函式外部繪制(更復雜的)東西do_draw,但我不知道如何cr從另一個函式訪問?
#include <cairo.h>
#include <gtk/gtk.h>
// gcc move.c -o move $(pkg-config --cflags --libs cairo --libs gtk -3.0)
gboolean timer = TRUE;
int i = 1;
static gboolean do_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data)
{
cairo_select_font_face(cr, "Courier", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
cairo_set_font_size(cr, 60);
cairo_move_to(cr, i, 300);
cairo_show_text(cr, "moving");
return FALSE;
}
static gboolean time_handler(GtkWidget *widget)
{
if (i > 15) return FALSE;
printf("drawing frame %d\n", i);
gtk_widget_queue_draw(widget);
i ;
return TRUE;
}
int main(int argc, char *argv[])
{
// gtk inits
gtk_init(&argc, &argv);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget *drawarea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), drawarea);
gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
g_signal_connect(G_OBJECT(drawarea), "draw", G_CALLBACK(do_draw), NULL);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
// timer
g_timeout_add(200, (GSourceFunc) time_handler, (gpointer) window);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
`
uj5u.com熱心網友回復:
據我了解,似乎“cr”是由 GTK 通過創建小部件drawarea 自動創建的。
不,它是視窗系統繪制事件提供的圖形背景關系的包裝器。每次繪制是否重新創建都取決于視窗系統,但是如果不處于繪制事件中,您將無法獲得該句柄。
例如,在 Windows下,在其處理程式中WM_PAINT獲取繪圖背景關系。BeginPaint但是,如果您想在其他地方創建自己的背景關系,則可以使用GetDC它來代替。
然而,Gtk 只支持在小部件上繪制的繪制事件(即上面的前半部分)。所以你無法在繪制事件之外獲得繪制背景關系,你需要觸發繪制事件并讓它自己繪制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/448240.html
上一篇:查找前三個整數
下一篇:在C中使用字串密鑰解密
