#include <gtk/gtk.h> GtkWidget *create_window(); //创建窗体和控件!! gboolean button_press(GtkWidget *window,GdkEventButton *event,gint data); int main(int argc,char *argv[]) { GtkWidget *window; gtk_init(&argc, &argv); //初始化 window = create_window(); //创建窗体和控件!! gtk_widget_show_all(window); //显示窗体和控件 gtk_main(); //事件循环处理 return 0; } GtkWidget *create_button(const gchar *button_str) { GtkWidget *button = gtk_button_new_with_label(button_str); return button; } GtkWidget *create_image(const gchar *path) { GtkWidget *image = gtk_image_new_from_file(path); return image; } //退出按钮(button2)单击事件函数 void button2_click() { gtk_main_quit(); } void button1_click() { GtkWidget *dialog; //提示框 gchar *msg = "科创职业学院计算机网络及应用\n三国软件开发小组 菜鸟\n邮箱:qiu_hai_long@sina.com\nqq:356752238\n"; GtkMessageType type = GTK_MESSAGE_INFO; //信息消息 //GTK_DIALOG_MODAL 对话框模式 GTK_BUTTONS_OK 只有一个'OK'按钮 dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, type, GTK_BUTTONS_OK, msg); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); //销毁dialog } //新建任意布局控件和布局上的控件内容 GtkWidget *create_fixed() { GtkWidget *fixed = gtk_fixed_new(); //新建任意布局 GtkWidget *button1 = create_button(" 确定 "); GtkWidget *button2 = create_button(" 退出 "); GtkWidget *text1 = gtk_entry_new(); GtkWidget *text2 = gtk_entry_new(); GtkWidget *image = create_image("1.png"); //设置text2为密码输入 gtk_entry_set_visibility gtk_entry_set_visibility(GTK_ENTRY(text2),FALSE); //设置控件的 宽和高 gtk_widget_set_size_request(text1, 110, 25); gtk_widget_set_size_request(text2, 110, 25); gtk_fixed_put(GTK_FIXED(fixed), image, 0, 0); //添加窗体背景图片 gtk_fixed_put(GTK_FIXED(fixed), button1, 90, 185); gtk_fixed_put(GTK_FIXED(fixed), button2, 195, 185); gtk_fixed_put(GTK_FIXED(fixed), text1, 167, 112); //添加 gtkentry的text1 gtk_fixed_put(GTK_FIXED(fixed), text2, 167, 145); //添加 gtk.....的text2 //退出按钮(button2)单击事件 g_signal_connect(G_OBJECT(button2),"clicked",G_CALLBACK(button2_click),NULL); //确定按钮(button1)单击事件 g_signal_connect(G_OBJECT(button1),"clicked",G_CALLBACK(button1_click),NULL); return fixed; } GtkWidget *create_window() //创建窗体和控件!! { GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); GtkWidget *fixed; gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 230, 150); //窗体大小 gtk_window_set_title(GTK_WINDOW(window),"精美窗体测试"); //标题栏 gtk_window_set_decorated(GTK_WINDOW(window),FALSE); //去掉窗口标题栏 //添加窗体事件掩码 GDK_BUTTON...MASK按下任何按键的时候,接收鼠标运动的事件!! gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK); fixed = create_fixed(); //新建任意布局控件和布局上的控件内容 //将fixed任意布局控件添加到最顶层窗体window!! gtk_container_add(GTK_CONTAINER(window), fixed); //为一个特定的对象(wnidow)链接返回函数(button_press)!! g_signal_connect(G_OBJECT(window), "button-press-event", G_CALLBACK(button_press), NULL); //为一个特定的对象(window)链接返回函数(gtk_main_quit)!! g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window)); return window; } //button-pree-event响应函数 gboolean button_press(GtkWidget *widget,GdkEventButton *event,gint data) { if(event->type == GDK_BUTTON_PRESS) //判断鼠标是否被按下 { if(event->button == 1)// 1代表鼠标左键!! 2 鼠标中间那个东东!! 3 就是剩下的那个!! { //gtk_widget_get_toplevel 返回顶层窗口 就是window!! gtk_window_begin_move_drag(GTK_WINDOW(gtk_widget_get_toplevel(widget)), event->button, event->x_root, event->y_root,event->time); } } } /* gtk_window_begin_move_drag 移动窗体!!第一个参数: GtkWindow *window 第二个参数: gint button 第三个参数: gint root_x 第四个参数: gint root_y 第五.....: guint32 timestamp 参考 GdkEventButton 结构体 GdkEventButton 结构体 typedef struct { GdkEventType type; GdkWindow *window; gint8 send_event; guint32 time; gdouble x; gdouble y; gdouble *axes; guint state; guint button; GdkDevice *device; gdouble x_root, y_root; } GdkEventButton; */