写了几个小时的代码,被指针都指晕了...
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "mysql/mysql.h"
#define hboxNumber 3
GtkWidget *window;//主窗体
GtkWidget *num_entry;//学号文本框
GtkWidget *name_entry;//姓名文本框
GtkWidget *class_entry;//班级文本框
GtkWidget *button_add;//新增按钮
GtkWidget *button_del;//删除按钮
GtkWidget *button_showAll;//显示所有学生按钮
GtkWidget *lbl_num;//学号标签
GtkWidget *lbl_name;//姓名标签
GtkWidget *lbl_class;//班级标签
GtkWidget *hbox[hboxNumber], *vbox;//水平和垂直盒子
GtkWidget *dialog;//对话框
GtkWidget *text;//文本区
GtkTextBuffer *buffer;//文本缓冲区
char sql[100];//sql语句字符串
void destroy(GtkWidget *widget,gpointer *data); //回调函数destroy,关闭窗口时系统自动调用
void btnAdd_clicked(GtkWidget *widget,gpointer *data);//新增按钮事件
void btnDel_clicked(GtkWidget *widget,gpointer *data);//删除按钮事件
void btnDisplay_clicked(GtkWidget *widget,gpointer *data);//显示所有学生按钮事件
void show_dialog(int index,gchar *msg);//对话框
int ISEmptyOrNull(const char *c);//判空函数
void create_text( void );//创建文本区
void insert_text (gchar *msg);//向文本区插入文字
int main(int argc,char **argv)
{
int i, j;
gtk_init(&argc,&argv); //初始化图形显示环境
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //创建窗口
gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
//设置当关闭窗口时,要执行的回调函数
g_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(destroy),NULL);
//创建文本输入框
num_entry = gtk_entry_new();
name_entry = gtk_entry_new();
class_entry = gtk_entry_new();
gtk_widget_set_usize(window,600,300); /*设置大小*/
gtk_widget_set_usize(num_entry,50,25);
gtk_widget_set_usize(name_entry,100,25);
gtk_widget_set_usize(class_entry,100,25);
lbl_num=gtk_label_new("学号");/*创建label标签*/
lbl_name=gtk_label_new("姓名");
lbl_class=gtk_label_new("班级");
button_add=gtk_button_new_with_label("添加学生"); /*创建按钮*/
button_del=gtk_button_new_with_label("删除学生");
button_showAll=gtk_button_new_with_label("显示所有学生信息");
create_text ();//创建文本区
/*指定按钮监听事件*/
g_signal_connect(GTK_OBJECT(button_add),"clicked", GTK_SIGNAL_FUNC(btnAdd_clicked), NULL);
g_signal_connect(GTK_OBJECT(button_del),"clicked", GTK_SIGNAL_FUNC(btnDel_clicked), NULL);
g_signal_connect(GTK_OBJECT(button_showAll),"clicked", GTK_SIGNAL_FUNC(btnDisplay_clicked), NULL);
/*创建多个水平盒子*/
for (i = 0; i < hboxNumber; i++)
{
hbox[i] = gtk_hbox_new (TRUE, 2);
}
vbox = gtk_vbox_new (FALSE, 10);/*创建一个垂直盒子*/
/*文本框和标签在第一个水平盒子中*/
gtk_box_pack_start (GTK_BOX(hbox[0]), lbl_num, TRUE, FALSE, 2);
gtk_box_pack_start (GTK_BOX(hbox[0]), num_entry, TRUE, FALSE, 2);
gtk_box_pack_start (GTK_BOX(hbox[0]), lbl_name, TRUE, FALSE, 2);
gtk_box_pack_start (GTK_BOX(hbox[0]), name_entry, TRUE, FALSE, 2);
gtk_box_pack_start (GTK_BOX(hbox[0]), lbl_class, TRUE, FALSE, 2);
gtk_box_pack_start (GTK_BOX(hbox[0]), class_entry, TRUE, FALSE, 2);
/*按钮在第二个水平盒子中*/
gtk_box_pack_start (GTK_BOX(hbox[1]), button_add, TRUE, FALSE, 2);
gtk_box_pack_start (GTK_BOX(hbox[1]), button_del, TRUE, FALSE, 2);
gtk_box_pack_start (GTK_BOX(hbox[1]), button_showAll, TRUE, FALSE, 2);
/*列表框在第三个水平盒子中*/
gtk_box_pack_start (GTK_BOX(hbox[2]), text, TRUE, FALSE, 2);
/*将水平盒子放入垂直盒子*/
for (i=0; i < hboxNumber; i++)
gtk_box_pack_start (GTK_BOX(vbox), hbox[i], FALSE, FALSE, 2);
/*将垂直盒子加入到窗口中*/
gtk_container_add(GTK_CONTAINER(window), vbox);
/*显示按钮和窗口*/
gtk_widget_show_all(window);
/*进入消息处理循环*/
gtk_main();
return 0;
}
/*定义回调函数destroy,关闭窗口时系统自动调用*/
void destroy(GtkWidget *widget,gpointer *data)
{
gtk_main_quit();
}
/*
执行SQL更新命令。
参数:sql是SQL命令字符串。
返回:0表示执行成功,非0表示错误。
*/
int execute_update_sql(char *sql)
{
MYSQL mysql;
int result=0;
mysql_init(&mysql); /*连接数据库*/
mysql_real_connect(&mysql,"localhost","root","","student",0,NULL,0);
mysql_real_query(&mysql,sql,strlen(sql)); /*执行sql命令*/
result=mysql_errno(&mysql); //得到执行结果代码,0表示正确,非0表示错误
mysql_close(&mysql); /*关闭数据库连接*/
return result;
}
/*定义回调函数btnAdd_clicked,单击新增按钮时自动调用*/
void btnAdd_clicked(GtkWidget *widget,gpointer *data)
{
const char *num;
const char *name;
const char *class;
num =gtk_entry_get_text (GTK_ENTRY (num_entry));//获取学号文本框的文本
name=gtk_entry_get_text (GTK_ENTRY (name_entry));//获取姓名
class=gtk_entry_get_text (GTK_ENTRY (class_entry));//获取班级
if(ISEmptyOrNull(num))//判断是否为空值或者是空串
{
show_dialog(1,"请输入学号!!!");//显示对话框
return;
}
if(ISEmptyOrNull(name))
{
show_dialog(1,"请输入姓名!!!");
return;
}
if(ISEmptyOrNull(class))
{
show_dialog(1,"请输入班级!!!");
return;
}
/*形成sql命令字符串*/
sprintf(sql,"insert into stu_table(stu_no,stu_name,class) values('%s','%s','%s')",num,name,class);
if(execute_update_sql(sql))/*执行sql命令字符串*/
{
show_dialog(2,"添加失败!!");
}
else
{
show_dialog(1,"添加成功!!");
}
}
/*定义删除按钮回调函数btnDel_clicked,单击新增按钮时自动调用*/
void btnDel_clicked(GtkWidget *widget,gpointer *data)
{
const char *num;
num =gtk_entry_get_text (GTK_ENTRY (num_entry));//获取学号文本框文本
if(ISEmptyOrNull(num))
{
show_dialog(1,"请输入学号!!!");
}
else
{
/*形成sql命令字符串*/
sprintf(sql,"delete from stu_table where stu_no='%s'",num);
/*执行sql命令字符串*/
if(execute_update_sql(sql))
{
show_dialog(2,"删除失败!");
}
else
{
show_dialog(1,"删除成功!");
}
}
}
/*定义显示列表按钮回调函数btnDisplay_clicked,单击新增按钮时自动调用*/
void btnDisplay_clicked(GtkWidget *widget,gpointer *data)
{
int i,row_number, field_number;
MYSQL mysql;
MYSQL_RES *res;
MYSQL_FIELD *fd;
MYSQL_ROW row;
char *ls_stu;
char *str1;
mysql_init(&mysql);/*连接数据库*/
mysql_real_connect(&mysql,"localhost","root","","student",0,NULL,0);
sprintf(sql,"select * from stu_table order by stu_no"); /*形成select命令字符串*/
mysql_real_query(&mysql,sql,strlen(sql)); /*执行sql命令*/
res=mysql_store_result(&mysql);//得到结果集
row_number=(int)mysql_num_rows(res);//结果集行数
field_number=(int)mysql_num_fields(res);//结果集总字段数
gtk_text_buffer_set_text(GTK_TEXT_BUFFER(text),"",-1);//将文本区文本清空
/*按列遍历结果集,显示记录*/
while(fd=mysql_fetch_field(res))
{
sprintf(str1,"%-12s",fd->name);
insert_text (str1);//将当前字段插入文本区末尾
}
insert_text ("\n"); //换行
/*按行遍历结果集,逐行显示记录*/
while((row=mysql_fetch_row(res))!=NULL)
{
for(i=0;i<field_number;i++)
{
sprintf(str1,"%-12s",row[i]);;
insert_text (str1);//将当前对应值插入文本区末尾
}
insert_text ("\n");
}
mysql_close(&mysql); /*关闭数据库连接*/
}
/*定义对话框函数
参数:第一个为对话框类型(1:消息类型,2:错误,3:询问,其他:警告)
第二个参数为显示的字符串消息。*/
void show_dialog(int index,gchar *msg)
{
GtkMessageType type;//对话框类型
switch(index)
{
case 1: type=GTK_MESSAGE_INFO;break;
case 2:type=GTK_MESSAGE_ERROR;break;
case 3: type=GTK_MESSAGE_QUESTION;break;
default :type=GTK_MESSAGE_WARNING;
}
dialog = gtk_message_dialog_new(NULL,
GTK_DIALOG_DESTROY_WITH_PARENT,type,GTK_BUTTONS_OK,msg);
//gtk_message_dialog_new(指定父窗体,关闭时刻选择(此处为跟随父窗体),窗体图标类型,确认按钮,消息)
gtk_dialog_run(GTK_DIALOG(dialog));//显示对话框
gtk_widget_destroy(dialog);//单击OK关闭对话框
}
int ISEmptyOrNull(const char *c)
{
int IsEmpty = 0;
int length = strlen(c);
int n;
//遍历整个字符串,如也为空果全为空格,则返回字符串
for(n=0;n<length;n++)
{
//判断ASCII码是否为32
if(c[n]==32)
IsEmpty=1;
else
{
IsEmpty=0;
//存在一个字符则跳出循环
break;
}
}
if(length == 0)
return 1;
else if(IsEmpty)
return 1;
else return 0;
}
void insert_text (gchar * data)
{
GtkTextIter start,end;
//获取文本区的开始和结尾指针
gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(buffer),&start,&end);
gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer),&end,data,strlen(data));//在末尾插入文本区
}
void create_text( void )
{
text = gtk_text_view_new ();//创建文本区
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));//获取文本缓冲区
gtk_widget_set_usize(text,500,190);//设置文本区大小
}
界面有点不好看...
上面这些是C源码
记得还要有数据库啊!!下面是数据库脚本:
drop database if exists student;
create database student;
use student;
CREATE TABLE stu_table(stu_no char(10), stu_name char (10), class char(10));
INSERT INTO stu_table VALUES('001', 'Tom', '1');
INSERT INTO stu_table VALUES('002', 'Peter', '3');
INSERT INTO stu_table VALUES('003', 'Mike', '2');
编译命令就很长了...有点儿坑爹的感觉....
gcc -o s4 s4.c `pkg-config --libs --cflags gtk+-2.0` -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient