文档章节

GTK中设置滚动条到某一特定位置

双子座
 双子座
发布于 2012/09/23 13:54
字数 797
阅读 636
收藏 2

接触GTK没多久,这个问题总算搞通了。可能还有更简便的方法,希望高手指点一下。

问题:滚动窗口中有一列表,列表中每一行的高度是确定的,用代码实现将滚动条滚动到某一行。

解决方案:

原理是设置滚动条的GtkAdjustment属性。

GtkAdjustment *adj;
adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolled_window));

这段代码是获取滚动窗口的纵向GtkAdjustment,之后,通过设定adj的值就可以实现设定滚动条的位置了。

gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), value);

但是要注意的是,要在程序执行gtk_main();之后才有效。例如,可以把上面的代码用在某个回调函数中。

本文所讨论的都是在gtk_main();执行之后的情况,否则的话将不能得到正确结果。

那么,value的值应该设定为多少,才能达到我们想要的效果呢。首先要明确几个概念,如下图所示:

    

Current Value:GtkAdjustment的当前值,如上图
Max Value:这个是我自己给起的名称,表示可以给GtkAdjustment设定的最大值,如上图
Page Size:如上图,滚动条按钮的长度
Page Increment:表示单击滚动条中的空白区域一次,Current Value发生变化的值
Step Increment:这个表示点击一次滚动条的上移或者下移按钮(也就是带三角形的按钮)一次,Current Value发生变化的值
Lower Value:如上图,表示最小值
Upper Value:如上图,可以理解为整个列表的高度

其中:

Max Value + Page Size = Upper Value
Step Increment + Page Increment = Page Size

上面的值都可以通过GTK提供的函数获取或者设置:

gdouble gtk_adjustment_get_value(GtkAdjustment *adjustment);
void gtk_adjustment_set_value(GtkAdjustment *adjustment, gdouble value);
gdouble gtk_adjustment_get_lower(GtkAdjustment *adjustment);
void gtk_adjustment_set_lower(GtkAdjustment *adjustment, gdouble lower);
gdouble gtk_adjustment_get_upper(GtkAdjustment *adjustment);
void gtk_adjustment_set_upper(GtkAdjustment *adjustment, gdouble upper);
gdouble gtk_adjustment_get_step_increment(GtkAdjustment *adjustment);
void gtk_adjustment_set_step_increment(GtkAdjustment *adjustment,  gdouble step_increment);
gdouble gtk_adjustment_get_page_increment(GtkAdjustment *adjustment);
void gtk_adjustment_set_page_increment(GtkAdjustment *adjustment, gdouble page_increment);
gdouble gtk_adjustment_get_page_size (GtkAdjustment *adjustment);
void gtk_adjustment_set_page_size(GtkAdjustment *adjustment, gdouble page_size);

明确了这些概念就可以精确的使得滚动条滚动到某位置了。但是gtk_adjustment_set_value这个函数在使用时要注意:

value值最好别大于Max Value值,也别小于Lower Value,否则滚动条上的滑块将会陷入两端,显得很不和谐。

以上面几张图为例,想要设置滚动条滚动到列表的某一行,由于每一行高度是固定的,所以可以采用以下方法:

/************************************************************************/
/* 函数名:scroll_to_line
/* 输入:  scrolled_window:要操作的滚动窗口
/*        line_num:列表中行数
/*        to_line_index:要滚动到的那一行的行号,从0开始
/* 输出:  无
/* 功能:  使得滚动窗口的滚动条滚到列表的某一行
/************************************************************************/
void scroll_to_line(GtkWidget *scrolled_window, gint line_num, gint to_line_index)
{
    GtkAdjustment *adj;
    gdouble lower_value, upper_value, page_size, max_value, line_height, to_value;
    adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolled_window));
    lower_value = gtk_adjustment_get_lower(adj);
    upper_value = gtk_adjustment_get_upper(adj);
    page_size = gtk_adjustment_get_page_size(adj);
    max_value = upper_value - page_size;
    line_height = upper_value/line_num;
    to_value = line_height*to_line_index;
    if (to_value < lower_value)
        to_value = lower_value;
    if (to_value > max_value)
        to_value = max_value;
    gtk_adjustment_set_value(adj, to_value);
}

有时候为了比较清晰地显示移动到那一行,可以用代码将那行标记为选择,大体代码如下:

GtkTreeSelection *selection;
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view_list));
GtkTreePath *path;
path = gtk_tree_path_new_from_indices(index, -1 ); 
gtk_tree_selection_select_path( selection, path );

这里直接操作的是滚动窗口中的Tree View。

© 著作权归作者所有

双子座
粉丝 540
博文 78
码字总数 61009
作品 0
南京
程序员
私信 提问
Vue scrollBehavior 滚动行为

原文https://www.cnblogs.com/sophiewang/p/7880261.html https://blog.csdn.net/wandoumm/article/details/80270865 使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚...

大灰狼的小绵羊哥哥
2018/12/07
0
0
Rhythmbox 将作为 Ubuntu 12.04 默认音乐播放器?

USA Florida UDS 最新动态。 Ubuntu 12.04作为一个LTS版本,将提供5年技术支持。其中最重要的考虑就是选择谁作为系统默认应用。 根据大会讨论情况,Thunder仍将作为默认邮件客户端,另外还带...

AndroidMe
2011/11/03
3K
28
Linux下基于GTK的C/S聊天软件

Linux环境基于GTK+的图形聊天软件设计 cnyinlinux 2016/02 西安 目 录 1.GTK+介绍 2.C/S聊天程序网络模型 3.聊天图形界面设计 本人业余时间玩儿了下GTK+,简单总结下写成这篇博客,如果有浅薄...

cnyinlinux
2016/02/24
570
1
jQuery图片延迟加载插件jQuery.lazyload

原帖地址:点我演示地址:点我 插件描述:jQuery图片延迟加载插件jQuery.lazyload,使用延迟加载在可提高网页下载速度。在某些情况下,它也能帮助减轻服务器负载。 使用方法 引用jquery和jqu...

ForingY
2016/11/06
38
0
Gstreamer官方教程汇总基本教程5---GUI toolkit integration

目标 本教程介绍了如何整合 GStreamer 到一个图形用户界面(GUI)工具包像GStreamer的集成GTK +。基本上,当GUI与用户交互时,GStreamer需要关心媒体的播放。最有趣的部分是这两个库的互动:...

曾经花田错
2014/03/03
240
0

没有更多内容

加载失败,请刷新页面

加载更多

LeetCode 第 287 号问题:寻找重复数,一道非常简单的数组遍历题,加上四个条件后感觉无从下手

今天分享的题目来源于 LeetCode 第 287 号问题:寻找重复数。 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只...

五分钟学算法
26分钟前
3
0
vuex mapActions

本文转载于:专业的前端网站➧vuex mapActions 在组件中使用 this.$store.dispatch('xxx') 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在...

前端老手
28分钟前
3
0
使用bash -x 调试信息查看lvextend -r的调用

--1.打开调试: [root@db01 storage]# set -x --2.执行命令: [root@db01 storage]# /usr/sbin/lvextend -r -L 710M /dev/shazam/storage + /usr/sbin/lvextend -r -L 710M /dev/shazam/sto......

突突突酱
37分钟前
3
0
Linux重定向及反弹shell详解

这里说Linux重定向的原因主要还是为了详细了解一下Linux中的反弹shell 目录 0x01 文件描述符 0x02 重定向 0x03 反弹shell 0x04 交互重定向 0x05 命令变形 0x01 文件描述符 Linux的文件描述符...

无心的梦呓
42分钟前
3
0
开发经验 初学51单片机建议用C语言

typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   新手学习51单片机建议用C语言。因为使用C语言入门的话,上手速度快。实现几个例程后...

志成就
48分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部