#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;
*/