如何实现GTK3窗口局部可滚动?(C语言+Glade开发场景)
GTK3+Glade+C 局部滚动布局实现求助
我正在使用GTK3、Glade和C语言开发程序,需要让某一窗口的局部区域(滚动区域总大小固定)实现可滚动效果:滚动条左侧区域可滚动以展示图片,右侧区域保持固定。目前我遇到了实现困难,以下是我编写的代码,同时附上Glade组件结构和窗口设计的截图说明:
- Glade组件结构:album窗口下包含fixed容器、滚动条(album_scroll)、网格(album_grid)、视图(album_view)等组件
- 窗口设计布局:左侧为需要滚动的图片展示区,右侧为固定区域,底部设置了滚动条
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <signal.h> #include <unistd.h> #include <string.h> #include <gtk/gtk.h> #include <gtk/gtkx.h> #include <math.h> #include <ctype.h> //login window GtkBuilder *builder; GtkWidget *window; GtkWidget *fixed1; GtkWidget *button1; GtkWidget *button2; GtkWidget *label1; GtkWidget *entry1; GtkWidget *entry2; GtkWidget *icon_entry; GtkWidget *image; //register window GtkWidget *r_window, *r_fixed; GtkWidget *r_button1, *r_button2, *r_label; GtkWidget *r_entry1, *r_entry2, *r_entry3; GtkWidget *r_image; //menu window GtkWidget *menu_win, *menu_fixed; GtkWidget *menu_button1, *menu_button2, *menu_button3; GtkWidget *menu_button4, *menu_button5, *menu_button6; //album window GtkWidget *album_win, *album_fixed; GtkWidget *album_grid, *album_label1, *album_label2; GtkWidget *album_view, *album_scroll; //showing functions void register_s (){ gtk_widget_show(r_window); } void login_s (){ gtk_widget_show(window); } void menu_s (){ gtk_widget_show(menu_win); } void album_s (){ gtk_widget_show(album_win); } //hiding functions void register_h (){ gtk_widget_hide(r_window); } void login_h (){ gtk_widget_hide(window); } void menu_h (){ gtk_widget_hide(menu_win); } void album_h (){ gtk_widget_hide(album_win); } int main(int argc, char *argv[]) { gtk_init(&argc, &argv); builder = gtk_builder_new_from_file ("testing.glade"); //login window window = GTK_WIDGET(gtk_builder_get_object(builder, "login_window")); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); fixed1 = GTK_WIDGET(gtk_builder_get_object(builder, "fixed1")); label1 = GTK_WIDGET(gtk_builder_get_object(builder, "label1")); entry1 = GTK_WIDGET(gtk_builder_get_object(builder, "entry1")); entry2 = GTK_WIDGET(gtk_builder_get_object(builder, "entry2")); image = GTK_WIDGET(gtk_builder_get_object(builder, "image")); button1 = GTK_WIDGET(gtk_builder_get_object(builder, "button1")); g_signal_connect(button1, "clicked", G_CALLBACK(register_s), NULL); g_signal_connect(button1, "clicked", G_CALLBACK(login_h), NULL); button2 = GTK_WIDGET(gtk_builder_get_object(builder, "button2")); g_signal_connect(button2, "clicked", G_CALLBACK(menu_s), NULL); g_signal_connect(button2, "clicked", G_CALLBACK(login_h), NULL); gtk_builder_connect_signals(builder, NULL); //register window r_window = GTK_WIDGET(gtk_builder_get_object(builder, "r_window")); g_signal_connect(r_window, "destroy", G_CALLBACK(gtk_main_quit), NULL); r_button1 = GTK_WIDGET(gtk_builder_get_object(builder, "r_button1")); r_button2 = GTK_WIDGET(gtk_builder_get_object(builder, "r_button2")); g_signal_connect(r_button2, "clicked", G_CALLBACK(login_s), NULL); g_signal_connect(r_button2, "clicked", G_CALLBACK(register_h), NULL); r_entry1 = GTK_WIDGET(gtk_builder_get_object(builder, "r_entry1")); r_entry2 = GTK_WIDGET(gtk_builder_get_object(builder, "r_entry2")); r_entry3 = GTK_WIDGET(gtk_builder_get_object(builder, "r_entry3")); r_fixed = GTK_WIDGET(gtk_builder_get_object(builder, "r_fixed")); r_label = GTK_WIDGET(gtk_builder_get_object(builder, "r_label")); r_image = GTK_WIDGET(gtk_builder_get_object(builder, "r_image")); //menu window menu_win = GTK_WIDGET(gtk_builder_get_object(builder, "menu_win")); g_signal_connect(menu_win, "destroy", G_CALLBACK(gtk_main_quit), NULL); menu_fixed = GTK_WIDGET(gtk_builder_get_object(builder, "menu_fixed")); menu_button1 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button1")); g_signal_connect(menu_button1, "clicked", G_CALLBACK(album_s), NULL); g_signal_connect(menu_button1, "clicked", G_CALLBACK(menu_h), NULL); menu_button2 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button2")); menu_button3 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button3")); menu_button4 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button4")); menu_button5 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button5")); menu_button6 = GTK_WIDGET(gtk_builder_get_object(builder, "menu_button6")); g_signal_connect(menu_button6, "clicked", G_CALLBACK(gtk_main_quit), NULL); //album window album_win = GTK_WIDGET(gtk_builder_get_object(builder, "album_win")); g_signal_connect(album_win, "destroy", G_CALLBACK(gtk_main_quit), NULL); album_fixed = GTK_WIDGET(gtk_builder_get_object(builder, "album_fixed")); album_grid = GTK_WIDGET(gtk_builder_get_object(builder, "album_grid")); album_view = GTK_WIDGET(gtk_builder_get_object(builder, "album_view")); album_scroll = GTK_WIDGET(gtk_builder_get_object(builder, "album_scroll")); gtk_range_set_range (GTK_RANGE(album_scroll), 0, 600 ); //g_signal_connect(album_scroll, "change-value", G_CALLBACK(), NULL); album_label1 = GTK_WIDGET(gtk_builder_get_object(builder, "album_label1")); album_label2 = GTK_WIDGET(gtk_builder_get_object(builder, "album_label2")); //main functions gtk_widget_show(window); gtk_main(); return EXIT_SUCCESS; }//main
需求
我是编程新手,希望得到简单易懂的步骤指导,完成左侧滚动、右侧固定的布局效果。
内容的提问来源于stack exchange,提问作者Kawano
相关产品推荐
相关产品推荐

