用c语言设计图片浏览器,◆C语言函数库简介系列◆ 1.3 增加图片浏览器的功能 zz...

这篇博客介绍了如何使用C语言和GTK+库创建一个具有文件打开功能的增强型图片浏览器。通过GLADE设计界面,添加了容器、工具条、状态条等元素,并实现了事件处理,特别是点击“打开”按钮时触发文件选择对话框的回调函数。还涉及了GTK+的消息传递机制和回调函数的概念。作业包括使用命令行参数打开图形文件。
摘要由CSDN通过智能技术生成

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

0.0写在前面的话--C也可以做很多事

http://post.baidu.com/f?kz=101575902

0.1工欲善其事,必先利其器--GCC以及MINGW

http://post.baidu.com/f?kz=102049062

1.1GUI王国的一朵奇葩,一枝独秀的GTK+

http://post.baidu.com/f?kz=102395749

1.2显示图片原来是这么简单--GTK+的图

http://post.baidu.com/f?kz=103079090

=======================================

1.3增强功能的图片浏览器

上一回我们的图片浏览器非常简单,只能打开一个固定的图片。

这一回我们将增加一个随意打开文件的功能。

涉及到的GTK+知识有:

容器概念

工具条TOOLBAR器件

工具条按钮Toolbarbutton器件

状态条Statusbar器件

GTK+的消息传递机制,回调函数CALLBACKFUNCTIONS

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。前面说过了,窗口只能含有一个子器件,不够用,我们只好通过别的途径扩充。

点击竖箱子(VerticalBox,从GtkBox继承来的),添加在Window里。GLADE提示你要几个空间,默认是3个。我们今天正好用3个,确定。修改它的属性(Properties),Style改为Icons,只显示图标。

点击工具条(ToolBar),添加在竖箱子的最上面。修改它的属性,StockButton改成一个“打开”图标。Name改为:button_open

点击工具条按钮(ToolbarButton),在工具条的第一个空间里添加。二、在竖箱子的第二层里,按上一课的做法,添加滚动窗口和图片器件。

三、在竖箱子的底层,添加一个状态条(StatusBar)。修改其属性,Name改为:Statusbar。

保存为2.glade。

1.3.3Gtk+的事件

现在我们要处理一件事,我们希望点击button_open按钮的时候,出现一个“打开文件”窗口。怎么告诉GTK+我们处理button_open点击呢?

这里只介绍libglade的做法,请大家课后参考gtk2.0指南(网上有很多),学学GTK+的原做法。

选中button_open,在Properties窗口中,选择Signals:

在Signal那里点“…”,出现SelectSignal对话框,选择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编译,运行。

这次编译的参数多加了一个:

gcc1.c-o1-Wl,--export-dynamic`pkg-config--cflags--libslibglade-2.0`

因为libglade需要在生成的二进制中查找注册的回调函数,所以你需要export-dynamic。

课后作业:

1、请尽量折腾GLADE,看看容器是怎么回事。

2、完成一个命令行式的程序:

./1some.jpg

即利用intmain(intargc,char**argv)来打开图形文件。

请把作业发布在C语言吧里。如果没有人交作业,教程将暂停。

具体的程序下载:

http://www.cublog.cn/u/1210/upfile/060605214522.gz

下载之后另存为2.tar.gz

然后可以用7-Z程序解压。

也可以打开msys,运行

cd/你存2.tar.gz的目录

tarzxvf2.tar.gz

作业的格式:

1、你的系统,你的程序设想

2、你是怎么操作GLADE的,把步骤简单写一下。

3、你的程序,怎么编译的。

作者: assiss 2006-6-5 21:53   回复此发言

备忘:

1.

gcc1.c-o1-Wl,--export-dynamic`pkg-config--cflags--libslibglade-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

回复此发言

网络编程,当然要用到Windows Socket(套接字)技术。Socket相关的操作由一系列API函数来完成,比如socket、bind、listen、connect、accept、send、sendto、recv、recvfrom等。调用这些API函数有一定的先后次序,有些函数的参数还比较复杂,对于开发者来说,不是很好用。于是,微软的MFC提供了两个类:CAsyncSocket和CSocket,极大地方便了Socket功能的使用。   CAsyncSocket类在较低层次上封装了Windows Socket API,并且通过内建一个(隐藏的)窗口,实现了适合Windows应用的异步机制(Windows Socket API默认情况下工作在阻塞模式,不方便直接在消息驱动的Windows程序上使用)。CSocket类从CAsyncSocket类派生,进一步简化了Socket功能的应用。不过很遗憾,正因为这两个类都内建了一个窗口,它们并不是线程安全的(thread-safe);如果要在多线程环境下应用Socket功能,建议自行封装Socket API函数。 基于TCP的socket编程的服务器端程序流程如下: 1、创建套接字 2、将套接字绑定到一个本地地址和端口号上(bind) 3、将套接字设为监听模式,准备接受客户请求(listen) 4、等待客户请求,请求到来时接受请求,建立链接,并返回 一个新的基于此次通信的套接字(accept) 5、用返回的套接字和客户端进行通信(send、recv) 6、返回,等待另一客户请求 7、关闭套接字 基于TCP的socket编程的客户端程序流程如下: 1、创建套接字 2、向服务器端发送请求(connect) 3、和服务器端进行通信(send、recv) 4、关闭套接字 基于UDP的socket编程的服务器端程序流程如下: 1、创建套接字 2、将套接字绑定到本地地址和端口号上(bind) 3、等待接收数据(recvfrom) 4、关闭套接字 基于UDP的socket编程的客户端程序流程如下: 1、创建套接字 2、和服务器端进行通信(sendto) 3、关闭套接字 异步方式指的是发送方不等接收方响应,便接着发下个数据包的通信方式;而同步指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式。   阻塞套接字是指执行此套接字的网络调用时,直到成功才返回,否则一直阻塞在此网络调用上,比如调用recv()函数读取网络缓冲区中的数据,如果没有数据到达,将一直挂在recv()这个函数调用上,直到读到一些数据,此函数调用才返回;而非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中,异步非阻塞套接字是用的最多的。平常所说的C/S(客户端/服务器)结构的软件就是异步非阻塞模式的。   对于这些概念,初学者的理解也许只能似是而非,我将用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制。目的是让初学者不仅对Socket异步非阻塞的概念有个非常透彻的理解,而且也给他们提供一个用Socket开发网络通信应用程序的快速入门方法。操作系统是Windows 98(或NT4.0),开发工具是Visual C++6.0。   MFC提供了一个异步类CAsyncSocket,它封装了异步、非阻塞Socket的基本功能,用它常用的网络通信软件很方便。但它屏蔽了Socket的异步、非阻塞等概念,开发人员无需了解异步、非阻塞Socket的原理和工作机制。因此,建议初学者学习编网络通信程序时,暂且不要用MFC提供的类,而先用Winsock2 API,这样有助于对异步、非阻塞Socket编程机制的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值