四、Gtk-调整对象、滚动窗口构件

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();

}

参考1:GTK-滚动窗口
参考2:GTK中在scrolled_window区域用滑轮操作独立scrollbar的方法

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值