编译可参考教程二
GTK 窗口
在这个示例中,演示如何在GTK窗口中使用Cairo绘制图形。基于GTK后端的Cairo绘图模型将贯穿于本指南。
#include<cairo.h>
#include<gtk/gtk.h>
staticgboolean
on_expose_event (GtkWidget * widget, GdkEventExpose * event, gpointer data)
{
cairo_t *cr;
cr = gdk_cairo_create (widget->window);
cairo_set_source_rgb (cr,
0.627,
0,
0);
cairo_select_font_face (cr,
"AdobeHeiti Std", CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size (cr,
24.0);
cairo_move_to (cr,
10.0,
34.0);
cairo_show_text (cr,
"Iam a Chinese.");
cairo_destroy (cr);
returnFALSE;
}
int
main (intargc,
char*argv[])
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (window,
"expose-event",
G_CALLBACK (on_expose_event),
NULL);
g_signal_connect (window,
"destroy",
G_CALLBACK (gtk_main_quit),
NULL);
gtk_window_set_position (GTK_WINDOW
(window),
GTK_WIN_POS_CENTER);
gtk_window_set_default_size (GTK_WINDOW
(window),
320,
48);
gtk_widget_set_app_paintable (window,
TRUE);
gtk_widget_show_all (window);
gtk_main ();
return0;
}
这个示例程序运行后,会在屏幕中央跳出一个GTK+窗口,上面绘制了一串文本.
#include<cairo.h>
#include<gtk/gtk.h>
首先要包含cairo与gtk+库的头文件。
g_signal_connect(window,
"expose-event",
G_CALLBACK (on_expose_event),
NULL);
当GTK+窗口被重绘时,会发出expose-event信号,我们可将这一信号连接到on_expose_event() 回调函数上。
gtk_widget_set_app_paintable(window, TRUE);
要在GTK+窗口中绘制Cairo图形,可以使用GtkDrawingAreawidget 或者更为简单的GtkWindowwidget,本例选择GtkWindow。由GtkWindowwidget 对expose-event信号处理后,默认要重新绘制窗口背景,这会将我们在on_expose_event() 函数中定义的Cairo图形覆盖掉,因此需要调用gtk_widget_set_app_paintable() 函数通知GTK+不要这么干。如果是在GtkDrawingAreawidget 中绘制Cairo图形,则可省去这一步。
cairo_t*cr;
cr = gdk_cairo_create (widget->window);
Cairo图形绘制工作是在on_expose_event() 函数中进行的,在该函数中,我们为GTK+系统创建了一个Cairo环境,并在该环境中绘制了一行文本。