GTK中在scrolled_window区域用滑轮操作独立scrollbar的方法
来源:互联网 发布:企业电话号码查询软件 编辑:程序博客网 时间:2024/06/06 05:50
这是我在实习期间改的一个bug,问题是在这样:
在GTK中 scrolled_window(滚动窗口)是自带 scrollbar(滚动条)的,但由于项目组代码架构的问题,系统中的 scrolled_window 自带的 scrollbar 全部被隐藏了,而通过独立于滚动窗口之外的 scrollbar 来对 scrolled_window 进行操作。因此造成一个问题,鼠标只有将光标放在 scrollbar 所在区域时,鼠标滑轮的滚动才能起作用,而超出这个范围,如光标在scrolled_window 的窗口区域时,就不起作用。而正常情况下我们的鼠标不可能一直放在滚动条区域,因此需要改。
在此期间,我想了三种方法:
1、将独立的 scrollbar 绑定 scrolled_window。经测试,这种方法不可行,当将 scrolled_window 自带的滚动条隐藏后,独立的 scrollbar 就不起作用了,只有在不隐藏的情况下,才起作用。
2、让整个窗口的焦点聚焦于滚动条上。经测试,虽然可以聚焦,缺陷很大,效果不好,而且对于整个系统来说,改动很大,不现实。
3、让独立scrollbar 和 scrolled_window所在的总窗口捕捉鼠标滑轮的信号,并通过回调函数来调整scrollbar 的adjustment从而达到控制滚动条移动的目的,经测试效果很好。
以下代码是第三种方案的测试代码,其中在注释部分包含了第二种方案的实现代码:
#include <gtk/gtk.h>GtkObject *adj1;int a=1;void destroy( GtkWidget *widget, gpointer data ){ gtk_main_quit ();}void draw_scroll(GtkWidget *widget, GdkEventScroll *event){ if(event->direction == GDK_SCROLL_UP) // 滑轮上滑{ g_print("1"); // 在终端打印1gtk_adjustment_set_value(GTK_ADJUSTMENT (adj1),--a); // 回调函数调整 adj1} if(event->direction == GDK_SCROLL_DOWN) // 滑轮下滑{ g_print("2"); gtk_adjustment_set_value(GTK_ADJUSTMENT (adj1),++a);}}int main(int argc,char *argv[]){ GtkWidget *window; GtkWidget *vbox,*hbox; GtkWidget *button; GtkWidget *table; GtkWidget *scrolled_window; GtkWidget *scrollbar; char buffer[32]; int i, j; gtk_init(&argc,&argv); /*创建window*/ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window),"scoll_test"); gtk_window_set_default_size(GTK_WINDOW(window),300,300); //g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL); g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (destroy), NULL); gtk_container_set_border_width(GTK_CONTAINER(window),0); /* vbox = gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(window),vbox); gtk_widget_show (vbox); */ /*创建hbox*/ hbox = gtk_hbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(window),hbox); gtk_widget_show (hbox); /*创建adjustment*/ adj1 = gtk_adjustment_new (0, 0, 50, 5, 10,2); /*创建scrolled_window*/ scrolled_window = gtk_scrolled_window_new (NULL,NULL); gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER,GTK_POLICY_NEVER); // GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS,这三个参数用来表示scrolled_window自带的滚动条的状态 // GTK_POLICY_NEVER表示隐藏,不出现 gtk_box_pack_start (GTK_BOX (hbox),scrolled_window, TRUE, TRUE, 0); gtk_widget_show (scrolled_window); /*创建table*/ table = gtk_table_new (10, 10, FALSE); gtk_table_set_row_spacings (GTK_TABLE (table), 10); gtk_table_set_col_spacings (GTK_TABLE (table), 10); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table); gtk_widget_show (table); /*在table中,循环创建table*/ for (i = 0; i < 10; i++) for (j = 0; j < 10; j++) { sprintf (buffer, "button (%d,%d)\n", i, j); button = gtk_toggle_button_new_with_label (buffer); gtk_table_attach_defaults (GTK_TABLE (table), button, i, i+1, j, j+1); gtk_widget_show (button); } button = gtk_button_new_with_label ("close"); g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), window); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);//GTK_DIALOG (window)->action_area,放在hbox中 gtk_widget_grab_default (button); gtk_widget_show (button); /*创建scrollbar,纵向的*/ scrollbar = gtk_vscrollbar_new (GTK_ADJUSTMENT (adj1)); // 可以通过调整adj1,来调整 scrollbar //scrollbar = gtk_vscrollbar_new (gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW(scrolled_window))); gtk_box_pack_start (GTK_BOX (hbox), scrollbar, TRUE, TRUE, 0);//GTK_DIALOG(window)->hbox,scrollbar放在hbox中 gtk_widget_show (scrollbar); //gtk_widget_show_all(window); /* 用于定位窗口焦点在scrollbar上 gtk_window_set_focus(GTK_WINDOW(window),scrollbar); g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL); */ /* window 捕捉鼠标滚轮的信号,并调用回调函数 draw_scroll*/ g_signal_connect(G_OBJECT (window), "scroll_event",G_CALLBACK(draw_scroll), NULL); /*窗口变化*/ //g_signal_connect(G_OBJECT (scrollbar) , "configure_event",G_CALLBACK(frame_callback), NULL); //g_signal_connect_after(G_OBJECT (window), "scroll_event",G_CALLBACK(draw_scroll), NULL); gtk_widget_show (window); gtk_main(); return 0;}
结果如下:
/*点滴积累,我的一小步O(∩_∩)O~*/
0 0
- GTK中在scrolled_window区域用滑轮操作独立scrollbar的方法
- Gtk-Message: Failed to load module “overlay-scrollbar”的解决办法
- 操作SCROLLBAR
- android中如何禁止Scrollbar滑动操作?
- tcltk创建scrollbar在treeview中
- GTK区域化语言的一些整理
- 在独立的Tomcat 中调用EJB
- 在独立的tomcat中调用EJB
- 在独立的tomcat中调用EJB
- 将滚动条(scrollbar)保持在最底部的方法
- 使用MATLAB在图像中选择矩形框区域的操作函数即过程
- 使用MATLAB在图像中选择矩形框区域的操作函数即过程
- 在ASP中操作数据库的方法
- 在ASP中操作数据库的方法
- 在Delphi中操作注册表的方法
- Duilib中Scrollbar的设置问题
- NavigationView中menu的scrollbar去除
- 如何去除NavigationView中menu的scrollbar?
- HDJ2020绝对值排序
- qsort与sort
- www外部加载
- 简历相关问题
- 绝对值排序
- GTK中在scrolled_window区域用滑轮操作独立scrollbar的方法
- 杭电1003
- 代代星笔试题
- O_RDWR, O_CREAT等open函数标志位在哪里定义?
- 工作日记-华为iscsi排查
- LBP纹理提取 C++实现
- ZooKeeper解惑
- 公用电子(笔试题)
- Ubuntu新装系统要装软件