1 调整对象(Adjustments)
后面讲到的滚动条、比例构件、微调按钮、文本构件、视角构件、复合列表框以及滚动窗口构建都用到了调整对象。page_size参数通常用于设置分栏构件(panning widget)的可视区域。upper参数用于表示分栏构件的子构件的最底部或最右边的坐标。因而,它不一定总是value能取的最大值,因为这些构件的page_size通常是非零值(value能取的最大值一般是upper-page_size)。
/**
* value: 赋给调整对象的初始值
* lower: 调整对象能取到的最低值
* upper: 调整对象能取到的最大值
* step_increment: 指定用户能小步增加的值
* page_increment: 用户能大步调整的值
* page_size: 通常用于设置分栏构件的可视区域
*/
GtkObject *gtk_adjustment_new( gdouble value,
gdouble lower,
gdouble upper,
gdouble step_increment,
gdouble page_increment,
gdouble page_size );
2 滚动窗口(Scrolled Windows)
滚动窗口用于创建一个可滚动区域,并将其它构件放入其中。可以在滚动窗口中插入任何其它构件,在其内部的构件不论尺寸大小都可以通过滚动条访问到。
/**
* 创建新的滚动窗口
* hadjustment: x方向调整对象
* vadjustment: y方向调整对象
*/
GtkWidget* gtk_scrolled_window_new (GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment);
/**
* 设置滚动条出现的方式
* hscrollbar_policy 水平滚动条出现的方式
* vscrollbar_policy 垂直滚动条的方式
* GTK_POLICY_ALWAYS 一直出现
* GTK_POLICY_AUTOMATIC 自动出现
* GTK_POLICY_NEVER 从不出现 (如果不出现,则该方向不能压缩变小到子控件尺寸以下)
* GTK_POLICY_EXTERNAL
*
*/
void gtk_scrolled_window_set_policy (GtkScrolledWindow *scrolled_window,
GtkPolicyType hscrollbar_policy,
GtkPolicyType vscrollbar_policy);
/*将构件放到滚动窗口里*/
void gtk_scrolled_window_add_with_viewport (GtkScrolledWindow *scrolled_window,
GtkWidget *child);
3 示例
#include <gtk/gtk.h>
GtkObject *adj;
gint a=1;
void draw_scroll(GtkWidget *widget, GdkEventScroll *event)
{
if(event->direction == GDK_SCROLL_UP) // 滑轮上滑
{
g_print("1"); // 在终端打印1
gtk_adjustment_set_value(GTK_ADJUSTMENT (adj),--a); // 回调函数调整 adj1
}
if(event->direction == GDK_SCROLL_DOWN) // 滑轮下滑
{
g_print("2");
gtk_adjustment_set_value(GTK_ADJUSTMENT (adj),++a);
}
}
int
main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *image_title;
GtkWidget *vbox_window;
GtkWidget *button;
GtkWidget *table;
GtkWidget *frame;
GtkWidget *image;
GtkWidget *hbox, *vbox, *label, *box;
GtkWidget *scrolled_window;
const GdkPixbuf *src_pixbuf;
GdkPixbuf *dest_pixbuf;
gint i, j;
gchar buffer[32];
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Test");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 500, 300);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
adj = gtk_adjustment_new(10, 0, 100, 1, 10, 0);
/**
* 创建滚动窗口
* hadjustment:水平方向的调整对象
* vadjustment:垂直方向的调整对象
*/
scrolled_window = gtk_scrolled_window_new(NULL,GTK_ADJUSTMENT(adj));
gtk_container_set_border_width(GTK_CONTAINER(scrolled_window), 10);
/**
* 设置滚动条出现的方式
* hscrollbar_policy 水平滚动条出现的方式
* vscrollbar_policy 垂直滚动条的方式
* GTK_POLICY_ALWAYS 一直出现
* GTK_POLICY_AUTOMATIC 自动出现
* GTK_POLICY_NEVER 从不出现
* GTK_POLICY_EXTERNAL
*
*/
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
vbox = gtk_vbox_new(FALSE, 10);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_box_pack_start (GTK_BOX (vbox),scrolled_window, TRUE, TRUE, 0);
button = gtk_button_new_with_label ("close");
g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_main_quit), window);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
vbox = gtk_vbox_new(FALSE, 10);
/* 滚动窗口增加 */
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), vbox);
for(i = 0; i < 3; i++){
image = gtk_image_new_from_file("../ico/Mail(128px).png");
gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 0);
image = gtk_image_new_from_file("../ico/Set(128px).png");
gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 0);
}
g_signal_connect(G_OBJECT (window), "scroll_event",G_CALLBACK(draw_scroll), NULL);
gtk_widget_show_all(window);
gtk_main();
}