下面演示了如何在窗口中增加一个按钮,示例代码均有注释
#include
static void print_hello (GtkWidget *widget,gpointer data)
{
//这是一个回调函数,这个data表示传给回调函数的参数。
g_print ("你好,世界n");
}
static gboolean on_delete_event (GtkWidget *widget,GdkEvent *event,gpointer data)
{
//如果返回FALSE在delete_event信号处理中,GTK将发送destroy信号,否则不会,这样窗口就不会关闭。
g_print ("delete event occurredn");
return TRUE;
}
int main (int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *button;
//初始化gtk应用程序
gtk_init (&argc, &argv);
//创造新的窗口,设置它的标题
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "你好");
//将delete_event信号绑定在on_delte_devent回调函数上,传递的参数为NULL
g_signal_connect (window, "delete-event", G_CALLBACK (on_delete_event), NULL);
//将destroy信号绑定在gtk_main_quit回调函数上,传递的参数为NULL
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
//设置窗口的边框宽度
gtk_container_set_border_width (GTK_ConTAINER (window), 10);
//创建一个新的标签
button = gtk_button_new_with_label ("Hello World");
//处理按钮的clicked信号
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
//g_signal_connect_swapped将clicked信号连接到window窗口的gtk_widget_destroy事件中。
g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
//将按钮加入到容器中
gtk_container_add (GTK_ConTAINER (window), button);
//显示这个按钮
gtk_widget_show (button);
//显示窗口
gtk_widget_show (window);
//开始GTK的主循环
gtk_main ();
return 0;
}
在XMANGER下用VIM编写好后,编译运行
#include
static cairo_surface_t *surface = NULL;
static void
clear_surface (void)
{
cairo_t *cr;
cr = cairo_create (surface);
cairo_set_source_rgb (cr, 1, 1, 1);
cairo_paint (cr);
cairo_destroy (cr);
}
static gboolean
configure_event_cb (GtkWidget *widget,
GdkEventConfigure *event,
gpointer data)
{
if (surface)
cairo_surface_destroy (surface);
surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
CAIRO_CONTENT_COLOR,
gtk_widget_get_allocated_width (widget),
gtk_widget_get_allocated_height (widget));
clear_surface ();
return TRUE;
}
static gboolean
draw_cb (GtkWidget *widget,
cairo_t *cr,
gpointer data)
{
cairo_set_source_surface (cr, surface, 0, 0);
cairo_paint (cr);
return FALSE;
}
static void
draw_brush (GtkWidget *widget,
gdouble x,
gdouble y)
{
cairo_t *cr;
cr = cairo_create (surface);
cairo_rectangle (cr, x - 3, y - 3, 6, 6);
cairo_fill (cr);
cairo_destroy (cr);
gtk_widget_queue_draw_area (widget, x - 3, y - 3, 6, 6);
}
static gboolean
button_press_event_cb (GtkWidget *widget,
GdkEventButton *event,
gpointer data)
{
if (surface == NULL)
return FALSE;
if (event->button == 1)
{
draw_brush (widget, event->x, event->y);
}
else if (event->button == 3)
{
clear_surface ();
gtk_widget_queue_draw (widget);
}
return TRUE;
}
static gboolean
motion_notify_event_cb (GtkWidget *widget,
GdkEventMotion *event,
gpointer data)
{
int x, y;
GdkModifierType state;
if (surface == NULL)
return FALSE;
gdk_window_get_pointer (event->window, &x, &y, &state);
if (state & GDK_BUTTON1_MASK)
draw_brush (widget, x, y);
return TRUE;
}
static void
close_window (void)
{
if (surface)
cairo_surface_destroy (surface);
gtk_main_quit ();
}
int
main (int argc,
char *argv[])
{
GtkWidget *window;
GtkWidget *frame;
GtkWidget *da;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Drawing Area");
g_signal_connect (window, "destroy", G_CALLBACK (close_window), NULL);
gtk_container_set_border_width (GTK_ConTAINER (window), 8);
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_frame (frame), GTK_SHADOW_IN);
gtk_container_add (GTK_ConTAINER (window), frame);
da = gtk_drawing_area_new ();
gtk_widget_set_size_request (da, 100, 100);
gtk_container_add (GTK_ConTAINER (frame), da);
g_signal_connect (da, "draw",
G_CALLBACK (draw_cb), NULL);
g_signal_connect (da,"configure-event",
G_CALLBACK (configure_event_cb), NULL);
g_signal_connect (da, "motion-notify-event",
G_CALLBACK (motion_notify_event_cb), NULL);
g_signal_connect (da, "button-press-event",
G_CALLBACK (button_press_event_cb), NULL);
gtk_widget_set_events (da, gtk_widget_get_events (da)
| GDK_BUTTON_PRESS_MASK
| GDK_POINTER_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
©著作权归作者所有:来自51CTO博客作者myhaspl的原创作品,如需转载,请注明出处,否则将追究法律责任



