16.9 CD数据库应用程序

在前面的章节中,你用MySQL和C语言接口开发了一个CD数据库应用程序。现在你将看到,用GNOME/GTK+给该程序创建一个GUI前端是多么容易,开发一个丰富的用户界面是多么快捷。

就像第8章中的CD数据库应用程序的需求一样,为运行本章中的CD数据库应用程序,你必须安装好了MySQL数据库和MySQL开发库。

为了简明起见,你将开发一个基础的、骨架式的用户界面,它仅实现应用程序的部分功能。例如,你不允许往CD里增加曲目信息或从CD里删除曲目信息。你将在这个应用程序里看到本章所介绍的构件的实际使用情况,这样你就可以了解它们在现实情况中是如何使用的了。

你将实现的主要功能有:

❑ 通过GUI登录数据库;

❑ 查找CD;

❑ 显示CD和曲目信息;

❑ 向数据库中增加一张CD;

❑ 创建一个“关于”(About)窗口;

❑ 在用户退出时进行确认。

你把代码分为3个源文件,它们共享同一个头文件cdapp_gnome.h。源文件将把创建窗口和对话框的函数——界面生成函数与回调函数分开。

实 验 cdapp_gnome.h

先来看看cdapp_gnome.h,它声明了那些你需要实现的函数。

(1)包含GNOME头文件和你在第8章中开发的接口函数所对应的头文件。这个示例程序使用了第8章中的app_mysql.h文件和app_mysql.c文件,以及该章中创建的数据库。

16.9 CD数据库应用程序 - 图1

(2)枚举类型标记了GtkTreeView构件的列,你将用GtkTreeView来显示CD和曲目信息:

16.9 CD数据库应用程序 - 图2

(3)在interface.c文件中有3个窗口创建函数:

16.9 CD数据库应用程序 - 图3

(4)针对菜单项、工具栏、对话框按钮和搜索按钮的回调函数在callbacks.c文件中:

16.9 CD数据库应用程序 - 图4

实 验 interface.c

接着,首先来看一下interface.c,该文件定义了你在应用程序中使用的窗口和对话框。

(1)首先是在callbacks.c和main.c中引用的一些构件指针:

16.9 CD数据库应用程序 - 图5

(2)app是一个具备文件作用域的主窗口指针:

16.9 CD数据库应用程序 - 图6

(3)定义一个辅助函数,它把一个带有指定文本标签的构件添加到容器中:

16.9 CD数据库应用程序 - 图7

16.9 CD数据库应用程序 - 图8

(4)为方便起见,菜单栏的定义使用了GNOMEUIINFO宏:

16.9 CD数据库应用程序 - 图9

(5)创建主窗口,向其中添加菜单和工具栏,设置其大小,将它放置在屏幕中央,组装构成用户界面的构件。注意,这个函数并未在屏幕上显示窗口,而是返回一个指向窗口的指针。

16.9 CD数据库应用程序 - 图10

(6)使用GTK+自带的图标来创建工具栏,并连接回调函数:

16.9 CD数据库应用程序 - 图11

16.9 CD数据库应用程序 - 图12

(7)创建用于搜索CD的构件:

16.9 CD数据库应用程序 - 图13

(8)gtk_scrolled_window提供滚动条,使构件(在本例中是GtkTreeView)可以扩展超出窗口的大小:

16.9 CD数据库应用程序 - 图14

(9)接下来,像通常那样用容器构件来排列界面元素:

16.9 CD数据库应用程序 - 图15

(10)然后创建GtkTreeView构件,增加3列,并将其放在GtkScrolledWindow中:

16.9 CD数据库应用程序 - 图16

16.9 CD数据库应用程序 - 图17

(11)最后,设定主窗口的内容,增加一个GnomeAppbar,并连接必要的回调函数:

16.9 CD数据库应用程序 - 图18

(12)下面的函数创建了一个简单的对话框,用来向数据库中添加一张新的CD。它包括艺术家、标题和类别的输入框,以及OK和Cancel按钮:

16.9 CD数据库应用程序 - 图19

16.9 CD数据库应用程序 - 图20

(13)用户在查询数据库之前需要先登录数据库。下面这个函数创建一个对话框,用于输入用户名和密码:

16.9 CD数据库应用程序 - 图21

实 验 callbacks.c

文件callbacks.c包含用于UI构件的回调函数定义。

(1)首先,需要包含头文件和引用一些在interface.c中定义的全局变量,这样你就可以读取和更改某些构件的属性了:

16.9 CD数据库应用程序 - 图22

(2)在quit_app中,调用database_end在退出前做清理工作并关闭数据库:

16.9 CD数据库应用程序 - 图23

(3)接下来的函数弹出一个简单的对话框,用于确认你是否想要退出应用程序,并返回一个gboolean类型的响应:

16.9 CD数据库应用程序 - 图24

(4)delete_event_handler是一个与主窗口的Gdk删除事件相连接的回调函数。这个事件在你试图关闭窗口时发送,但它位于GTK+destroy信号发出之前。

16.9 CD数据库应用程序 - 图25

(5)下一个函数在用户点击增加CD对话框中的按钮时被调用。如果点击了OK按钮,程序将字符串复制到一个非const的字符数组中,并将其中的数据传递给MySQL的接口函数add_cd:

16.9 CD数据库应用程序 - 图26

16.9 CD数据库应用程序 - 图27

(6)这是整个应用程序的核心部分:获取搜索结果,并填充GtkTreeView。

16.9 CD数据库应用程序 - 图28

(7)你从输入框构件中得到搜索字符串,将其复制到一个非const的变量中,然后获取匹配CD的ID:

16.9 CD数据库应用程序 - 图29

(8)接着,更新appbar来显示一条消息,通知用户搜索结果:

16.9 CD数据库应用程序 - 图30

(9)现在你得到了搜索结果,可以用它来填充GtkTreeStore了。对每个CD ID,你需要获取其对应的current_cd_st结构(这个结构包含了CD的标题和作曲家信息),然后获取其曲目列表。还要限制CD条目的总数不超过app_mysql.h中定义的MAX_CD_RESULT值,来确保GtkTreeStore不会溢出。

16.9 CD数据库应用程序 - 图31

(10)addcd对话框是非模式的。因此,你需要在创建和显示它之前先检查它是否已存在:

16.9 CD数据库应用程序 - 图32

(11)当点击About按钮时,一个标准的GNOME about(关于)窗口将弹出:

16.9 CD数据库应用程序 - 图33

16.9 CD数据库应用程序 - 图34

实 验 main.c

输入下面代码,将它命名为main.c,它包含这个程序的main函数。

(1)在include语句之后,你引用在interface.c中定义的用户名和密码输入构件:

16.9 CD数据库应用程序 - 图35

(2)像通常一样初始化GNOME库,然后创建并显示主窗口和登录对话框:

16.9 CD数据库应用程序 - 图36

(3)程序不断循环,直到用户输入了一个正确的用户名和密码。用户可以通过点击Cancel按钮退出,此时程序会询问他是否确认这个操作。

16.9 CD数据库应用程序 - 图37

16.9 CD数据库应用程序 - 图38

(4)如果database_start失败,它将显示一条错误信息,并重新显示登录对话框:

16.9 CD数据库应用程序 - 图39

(5)你将编写一个makefile文件来编译这个应用程序。和第8章中一样,你可能需要添加mysqlclient库的路径,如下所示:

-L/usr/lib/mysql

在-L之后指定你的系统中放置MySQL库的目录。

16.9 CD数据库应用程序 - 图40

(6)现在只需使用make命令来编译这个CD应用程序即可:

make -f Makefile

运行app,你将会看到一个GNOME风格的CD应用程序(如图16-15)。

16.9 CD数据库应用程序 - 图41

图 16-15