您的位置:首页 > 编程语言 > C语言/C++

◆C语言函数库简介系列◆ 1.3 增加图片浏览器的功能 zz

2007-02-09 23:53 525 查看
http://post.baidu.com/f?kz=104802247

◆C语言函数库简介系列◆

0.0 写在前面的话--C也可以做很多事
http://post.baidu.com/f?kz=101575902

0.1 工欲善其事,必先利其器--GCC以及MINGW
http://post.baidu.com/f?kz=102049062

1.1 GUI王国的一朵奇葩,一枝独秀的GTK+
http://post.baidu.com/f?kz=102395749

1.2 显示图片原来是这么简单--GTK+的图
http://post.baidu.com/f?kz=103079090
=======================================

1.3 增强功能的图片浏览器
上一回我们的图片浏览器非常简单,只能打开一个固定的图片。
这一回我们将增加一个随意打开文件的功能。
涉及到的GTK+知识有:
容器概念
工具条TOOLBAR器件
工具条按钮Toolbar button器件
状态条Statusbar器件
GTK+的消息传递机制,回调函数CALLBACK FUNCTIONS

1.3.1 容器
详细资料请参阅GTK+的手册。这里我只是简单介绍一下。
GTK+里只有容器才能包含其它器件。凡是从GTK_CONTAINER继承下去的都是容器,
容器分:
单容器(只能含有一个子器件)GtkBin. GtkWindow就是从GTK_BIN继承下来的只能含有一个子器件的容器。
箱子(横列或纵列,一维,可含有多个子器件)GtkBox。
表格(二维,可含有n*m个子器件)GtkTable
固定容器(可按坐标任意放置多个子器件)GtkFixed
图标容器(可设置图片,比如做一个资源管理器)GtkIconView
多文本容器(强大的文本显示器件,可设置各种文本属性,可以加入图片,比如做一个WORD)GtkTextView
树形容器(可做一个列表,也可以表达复杂的树形关系)GtkTreeView
Socket容器(可以通过SOCKET包含另外一个程序的界面,非常COOL,在WINDOWS下也能做到)GtkSocket
Tab容器(笔记本,可含有多个TAB)GtkNoteBook
工具条容器(有谁不知道工具条的?)GtkToolBar

容器可以套容器。
1.3.2 设计界面
一、打开GLADE。添加一个新窗口Window。前面说过了,窗口只能含有一个子器件,不够用,我们只好通过别的途径扩充。
点击竖箱子(Vertical Box,从GtkBox继承来的),添加在Window里。GLADE提示你要几个空间,默认是3个。我们今天正好用3个,确定。修改它的属性(Properties),Style改为Icons,只显示图标。
点击工具条(ToolBar),添加在竖箱子的最上面。修改它的属性,Stock Button改成一个“打开”图标。Name改为:button_open
点击工具条按钮(Toolbar Button),在工具条的第一个空间里添加。二、在竖箱子的第二层里,按上一课的做法,添加滚动窗口和图片器件。
三、在竖箱子的底层,添加一个状态条(Status Bar)。修改其属性,Name改为:Statusbar。

保存为2.glade。

1.3.3 Gtk+的事件
现在我们要处理一件事,我们希望点击button_open按钮的时候,出现一个“打开文件”窗口。怎么告诉GTK+我们处理button_open点击呢?
这里只介绍libglade的做法,请大家课后参考gtk2.0指南(网上有很多),学学GTK+的原做法。
选中button_open,在Properties窗口中,选择Signals:
在Signal那里点“…”,出现Select Signal对话框,选择clicked,确定。
Handler自动变成on_button_open_clicked,很好
点Add,就添加了一个新事件处理回调函数。

在这里,clicked就是一个事件,即鼠标点击事件。我们希望鼠标点击的时候,程序执行on_button_open_clicked函数。on_button_open_clicked函数就是回调函数。它的格式请参考GTK+手册(不同事件的回调函数格式是不一样的!!!)。你可以在GtkButton里找到。

另外,我们选中imagewindow窗口,给它添加一个事件:destroy(倒数第二个),别急着按Add,我们先把Handler改成gtk_main_quit。再Add.

destroy事件的意思是窗口被关闭,这时候我们希望程序执行gtk_main_quit。这个函数的功能是退出整个程序。

1.3.4 编写程序。见附件。
要注意仔细阅读这次的代码,因为UNIX平台和WINDOWS平台有些差异,你们必须修改一下。放心,很简单的,我已经在代码里说得很清楚了。

1.3.5 编译,运行。
这次编译的参数多加了一个:
gcc 1.c -o 1 -Wl,--export-dynamic `pkg-config --cflags --libs libglade-2.0`
因为libglade需要在生成的二进制中查找注册的回调函数,所以你需要export-dynamic。

课后作业:
1、请尽量折腾GLADE,看看容器是怎么回事。
2、完成一个命令行式的程序:
./1 some.jpg
即利用int main(int argc, char **argv)来打开图形文件。
请把作业发布在C语言吧里。如果没有人交作业,教程将暂停。

具体的程序下载:
http://www.cublog.cn/u/1210/upfile/060605214522.gz
下载之后另存为2.tar.gz
然后可以用7-Z程序解压。

也可以打开msys,运行
cd /你存2.tar.gz的目录
tar zxvf 2.tar.gz
作业的格式:

1、你的系统,你的程序设想
2、你是怎么操作GLADE的,把步骤简单写一下。
3、你的程序,怎么编译的。
作者: assiss 2006-6-5 21:53   回复此发言
备忘:
1.
gcc 1.c -o 1 -Wl,--export-dynamic `pkg-config --cflags --libs libglade-2.0`
其中-Wl,--export-dynamic的意思是将--export-dynamic传给连接器.

2.
由于libgrade在win与nix中不同,可以用预编译指令解决:
#ifdef _WIN32
...
#else
...
#endif

3.
当构件有很多,又有很多的callback事件回调函数时,可以这么做:
选glade->file->build,这时会生成support.c,support.h,interface.c,interface.h,callbacks.c, callback.h
六个文件,其中interface.c是界面生成,support提供一些辅助函数,callbacks就是所有回调的原型和声明,可以直接利用.
interface和support如果不使用libgrade的话才用得到.使用libgrade可能就派不上用场.
作者: 无效昵称 2006-6-6 00:08   回复此发言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: