编译可参考教程二
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环境,并在该环境中绘制了一行文本。