linux应用程序开发指南之21-10.pdf
《linux应用程序开发指南之21-10.pdf》由会员分享,可在线阅读,更多相关《linux应用程序开发指南之21-10.pdf(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、下载第10章 容器构件GtkContainer10.1 事件盒构件GtkEventBox 一些G T K构件没有与之相关联的X窗口,所以它们只在其父构件上显示其外观。由于这个原因,它们不能接收任何事件,并且,如果它们尺寸设置不正确,它们也不会自动剪裁,这样 可 能 会 把 界 面 弄 得 乱 糟 糟 的。如 果 要 想 构 件 接 收 事 件,可 以 使 用 事 件 盒 构 件(G t k E v e n t B o x)。初一看,G t k E v e n t B o x构件好像完全没有什么用。它在屏幕上什么也不画,并且对事件也不做响应。但是,它有一个功能:为它的子构件提供一个 X窗口。因为
2、许多 G T K构件并没有相关联的X窗口,所以这一点很重要。虽然没有 X窗口会节省内存,提高系统性能,但它也有一些弱点。没有X窗口的构件不能接收事件,并且对它的任何内容不实施剪裁。事件盒构件的名称强调它的事件处理功能,同时,它也能用于剪裁构件。用以下函数创建一个新的事件盒构件:GtkWidget*gtk_event_box_new(void);然后子构件就可以添加到G t k E v e n t B o x里面:gtk_container_add(GTK_CONTAINER(event_box),child_widget);下面的示例演示了事件盒的用途:创建一个标签,将它剪裁,放到一个小盒子里
3、面,然后设置让鼠标点击时程序退出。改变窗口的尺寸会使标签构件的尺寸发生变化。/*事件盒构件示例开始eventbox.c*/#include int main(int argc,char*argv)GtkWidget*window;GtkWidget*event_box;GtkWidget*label;gtk_init(&argc,&argv);window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),Event Box);gtk_signal_connect(GTK_OBJECT(win
4、dow),destroy,GTK_SIGNAL_FUNC(gtk_exit),NULL);gtk_container_set_border_width(GTK_CONTAINER(window),10);/*创建一个事件盒,然后将它加到顶级窗口上*/event_box=gtk_event_box_new();gtk_container_add(GTK_CONTAINER(window),event_box);gtk_widget_show(event_box);/*创建一个长标签*/label=gtk_label_new(Click here to quit,quit,quit,quit,qu
5、it);gtk_container_add(GTK_CONTAINER(event_box),label);gtk_widget_show(label);/*将标签剪裁短*/gtk_widget_set_usize(label,110,20);/*为它绑定一个动作*/gtk_widget_set_events(event_box,GDK_BUTTON_PRESS_MASK);gtk_signal_connect(GTK_OBJECT(event_box),button_press_event,GTK_SIGNAL_FUNC(gtk_exit),NULL);/*为事件盒创建一个X窗口*/gtk_
6、widget_realize(event_box);gdk_window_set_cursor(event_box-window,gdk_cursor_new(GDK_HAND1);gtk_widget_show(window);gtk_main();r e t u r n(0);/*示例结束*/将上面的代码保存为e v e n t b o x.c,然后写一个下面这样的M a k e f i l e:CC=gcceventbox:eventbox.c$(CC)gtk-config-cflags eventbox.c-o eventbox gtk-config-libsclean:rm-f*.o
7、 eventbox编译之后,运行结果如图 1 0-1所示。改变窗口大小时,标签所显示的文本数量也会改变。点击标签,应用程序会退出。图10-1 使用事件盒,可以让标签构件对点击进行响应10.2 对齐构件GtkAlignmentG t k A l i g n m e n t(对齐构件)允许将一个构件放在相对于对齐构件窗口的某个位置和尺寸上。例如,将一个构件放在窗口的正中间时,就要使用对齐构件。只有如下两个函数与对齐构件相关联:GtkWidget*gtk_alignment_new(gfloat xalign,gfloat yalign,gfloat xscale,gfloat yscale);vo
8、id gtk_alignment_set(GtkAlignment*alignment,166使第二部分 Linux编程常用C语言函数库及构件库下载gfloat xalign,gfloat yalign,gfloat xscale,gfloat yscale);第一个函数用指定的参数创建新的对齐构件。第二个函数用于改变对齐构件的参数。上面函数的所有四个参数都是介于 0.0与1.0间的浮点数。xalign 和 y a l i g n参数影响对齐构件内部的构件位置。x s c a l e和yscale 参数影响分配给构件的空间总数。使用以下函数可以将子构件添加到对齐构件中:gtk_containe
9、r_add(GTK_CONTAINER(alignment),child_widget);要看关于对齐构件的例子,请看进度条构件的示例。10.3 框架构件GtkFrameG t k F r a m e(框架构件)可以用于在盒子中封装一个或一组构件,框架本身还可以有一个标签。标签的位置和风格可以灵活改变。用下面函数可以创建新框架构件:GtkWidget*gtk_frame_new(const gchar*label);其中,l a b e l参数是框架构件的标签。缺省设置时,标签放在框架的左上角。传递 N U L L时,框架不显示标签。标签文本可以用下面的函数改变。void gtk_frame_
10、set_label(GtkFrame *frame,const gchar*label);标签的位置可以用下面的函数改变:void gtk_frame_set_label_align(GtkFrame*frame,gfloat xalign,gfloat yalign);x a l i g n和y a l i g n参数取值范围介于0.0和1.0之间。x a l i g n指定标签在框架构件上部水平线上的位置。y a l i g n参数目前还没有使用。x a l i g n的缺省值是0.0,它将标签放在框架构件的左上角处。下面的函数用于改变f r a m e的轮廓框的风格。void gtk_f
11、rame_set_shadow_type(GtkFrame *frame,GtkShadowType type);Ty p e参数可以取以下值:G T K _ S H A D O W _ N O N EG T K _ S H A D O W _ I NG T K _ S H A D O W _ O U TGTK_SHADOW_ETCHED_IN(缺省值)G T K _ S H A D O W _ E T C H E D _ O U T下面的例子演示了怎样使用框架构件。/*框架构件示例开始 frame.c*/#include int main(int argc,char*argv)第1 0章容器
12、构件G t k C o n t a i n e r使167下载/*构件的存储类型是GtkWidget*/GtkWidget*window;GtkWidget*frame;GtkWidget*button;gint i;/*初始化GTK*/gtk_init(&argc,&argv);/*创建一个新窗口*/window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),Frame Example);/*为窗口的 d e s t o r y 事件设置一个回调函数*/gtk_signal_connec
13、t(GTK_OBJECT(window),destroy,GTK_SIGNAL_FUNC(gtk_main_quit),NULL);gtk_widget_set_usize(window,300,300);/*设置窗口的边框宽度*/gtk_container_set_border_width(GTK_CONTAINER(window),10);/*创建一个框架构件*/frame=gtk_frame_new(NULL);gtk_container_add(GTK_CONTAINER(window),frame);/*设置框架的标签*/gtk_frame_set_label(GTK_FRAME(f
14、rame),GTK Frame Widget);/*将标签在框架构件的右边对齐*/gtk_frame_set_label_align(GTK_FRAME(frame),1.0,0.0);/*设置框架构件的风格*/gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);g t k _ w i d g e t _ s h o w(f r a m e);/*显示窗口*/gtk_widget_show(window);/*进入主循环*/gtk_main();r e t u r n(0);/*示例结束*/将上述代码保存为f r
15、a m e.c,然后编写一个像下面这样的M a k e f i l e文件。CC=gccframe:frame.c$(CC)gtk-config-cflags frame.c-o frame 168使第二部分 Linux编程常用C语言函数库及构件库下载gtk-config-libsclean:rm-f*.o frame运行结果如图1 0-2所示。请注意,框架构件的标题在构件的右上角。10.4 比例框架构件GtkAspectFrameG t k A s p e c t F r a m e(比例框架构件)和框架构件差不多,差别在于它会保持子构件的长宽比例,如果需要,还会在构件中增加额外的可用空间。
16、例如,想预览一个大的图片。当用户改变窗口的尺寸时,预览的尺寸会随之改变,但是纵横比例要与原来的尺寸保持一致。用以下函数创建新比例框架构件:GtkWidget*gtk_aspect_frame_new(const gchar*label,gfloat xalign,gfloat yalign,gfloat ratio,gint obey_child);x a l i g n和y a l i g n参数指定对齐构件的调整值。如果 o b e y _ c h i l d参数设置为T R U E,子构件的长宽比例会和它所请求的理想长宽比例相匹配。否则,比例值由 r a t i o参数指定。用以下函数可
17、以改变已有比例框架构件的选项:void gtk_aspect_frame_set(GtkAspectFrame*aspect_frame,gfloat xalign,gfloat yalign,gfloat ratio,gint obey_child);在下面的示例中,程序用一个比例框架构件显示一个绘图区,纵横比例总是 2:1,而不管用户如何改变顶级窗口的尺寸。/*比例框架构件示例 开始aspectframe.c*/#include i n tmain(int argc,char*argv)GtkWidget*window;GtkWidget*aspect_frame;GtkWidget*dr
18、awing_area;gtk_init(&argc,&argv);window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),Aspect Frame);gtk_signal_connect(GTK_OBJECT(window),destroy,GTK_SIGNAL_FUNC(gtk_main_quit),NULL);gtk_container_set_border_width(GTK_CONTAINER(window),10);/*创建一个比例框架构件,将它添加到顶级窗口中*/aspec
19、t_frame=gtk_aspect_frame_new(21,/*标签*/第1 0章容器构件G t k C o n t a i n e r使169下载图10-2 框架构件0.5,/*x 方向居中*/0.5,/*y 方向居中*/2,/*xsize/ysize=2*/FALSE/*忽略子构件的比例*/);gtk_container_add(GTK_CONTAINER(window),aspect_frame);gtk_widget_show(aspect_frame);/*添加一个子构件到比例框架构件中*/drawing_area=gtk_drawing_area_new();/*要求画一个2
20、0 02 0 0的窗口,但是比例框架构件会给出一个 2 0 01 0 0*的窗口,因为我们已经指定了21的比例值*/gtk_widget_set_usize(drawing_area,200,200);gtk_container_add(GTK_CONTAINER(aspect_frame),drawing_area);gtk_widget_show(drawing_area);gtk_widget_show(window);gtk_main();return 0;/*示例结束*/将上面的代码保存为a s p e c t f r a m e.c,然后编写一个如下所示的M a k e f i l
21、 e文件。CC=gccaspectframe:aspectframe.c$(CC)gtk-config-cflags aspectframe.c-o aspectframe gtk-config-libsclean:rm-f*.o aspectframe编译后,执行结果见图1 0-3。试着调整窗口的尺寸,看一看框架构件如何变化。图10-3 比例框架构件10.5 分栏窗口构件GtkPanedWindow如果想要将一个窗口分成两个部分,可以使用 G t k P a n e d Wi n d o w(分栏窗口构件)。窗口两部分的尺寸由用户控制,它们之间有一个凹槽,上面有一个手柄,用户可以拖动此手柄改
22、变170使第二部分 Linux编程常用C语言函数库及构件库下载两部分的比例。窗口划分可以是水平(H P a n e d)或垂直的(V P a n e d)。有两种分栏窗口构件:G t k H P a n e d(水平分栏窗口构件)和G t k V P a n e d(垂直分栏窗口构件)。用以下函数创建新的分栏窗口构件:GtkWidget*gtk_hpaned_new(void);/*水平分栏窗口构件*/GtkWidget*gtk_vpaned_new(void);/*垂直分栏窗口构件*/创建了分栏窗口构件后,可以在它的两边添加子构件。用下面的函数完成:void gtk_paned_add1(G
23、tkPaned*paned,GtkWidget*child);void gtk_paned_add2(GtkPaned*paned,GtkWidget*child);gtk_paned_add1()将子构件添加到分栏窗口构件的左边或顶部。gtk_paned_add2()将子构件添加到分栏窗口构件的右边或下部。如果希望在分栏窗口构件上设置很复杂的界面,可以将该构件和组装盒(G t k H B o x和G t k V B o x)或表格构件结合使用。分栏窗口构件的视觉外观可以用以下函数改变:void gtk_paned_set_handle_size(GtkPaned*paned,guint16
24、size);void gtk_paned_set_gutter_size(GtkPaned*paned,guint16 size);第一个函数设置手柄的尺寸,第二个函数设置两部分之间的凹槽的尺寸。在下面的例子中,创建了一个假想的用户 E m a i l程序的用户界面。窗口被垂直划分为两个部分,上面部分显示一个 E m a i l信息列表,下部显示 E m a i l文本信息。所有的程序都是相当直接的。有几点要注意:在文本构件显现前文本不能加到文本构件中,但你可以调用g t k _ w i d g e t _ r e a l i z e()函数完成,不过,作为一个技巧,我们可以为构件的“r e
25、a l i z e”信号设置一个信号处理函数,并在这个函数里面添加文本;还有,我们需要为包含文本窗口和它的滚动条的表格构件(G t k Ta b l e)设置G T K _ S H R I N K选项,以便当窗口的底部变小时,能够正确显示,而不是将下部的构件压到窗口的底部去。/*分栏窗口构件示例 paned.c*/#include/*创建一个信息列表*/GtkWidget*create_list(void)GtkWidget*scrolled_window;GtkWidget*list;GtkWidget*list_item;int i;char buffer16;/*创建一个新的分栏窗口构件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 应用程序 开发 指南 21 10
限制150内