和qt非常相像,基于c语言的 gtk是跨平台的。
#include <cstdlib>
//头文件的东西,请根据自己的安装目录设置
#include <gtk-2.0/gdk/gdk.h>
#include <gtk-2.0/gtk/gtkwidget.h>
#include <gtk-2.0/gtk/gtkmain.h>
#include <gtk-2.0/gtk/gtkwindow.h>
#include <gtk-2.0/gtk/gtkenums.h>
#include <gtk-2.0/gtk/gtkstyle.h>
#include <gtk-2.0/gdk/gdktypes.h>
#include <gtk-2.0/gdk/gdkscreen.h>
#include <glib-2.0/glib/gtypes.h>
#include <glib-2.0/gobject/gsignal.h>
#include <gtk-2.0/gtk/gtktypeutils.h>
#include <gtk-2.0/gtk/gtkbutton.h>
#include <gtk-2.0/gtk/gtkhbox.h>
#include <glib-2.0/glib/gmacros.h>
#include <gtk-2.0/gtk/gtkvbox.h>
#include <gtk-2.0/gtk/gtkbox.h>
#include <gtk-2.0/gtk/gtkcontainer.h>
#include <gtk-2.0/gtk/gtktable.h>
#include <gtk-2.0/gtk/gtkalignment.h>
#include <gtk-2.0/gtk/gtktogglebutton.h>
#include <gtk-2.0/gtk/gtkmessagedialog.h>
#include <gtk-2.0/gtk/gtkdialog.h>
using namespace std;
void center001(GtkWidget *widget) {
//居中方法1
gtk_window_position(GTK_WINDOW(widget), GTK_WIN_POS_CENTER_ALWAYS);
gtk_widget_show(widget);
}
//居中方法2
void center002(GtkWidget *widget) {
gtk_widget_show_all(widget);
GdkScreen *screen = gdk_screen_get_default();
gint w = gdk_screen_get_width(screen);
gint h = gdk_screen_get_height(screen);
gint window_w = widget->allocation.width;
gint window_h = widget->allocation.height;
gtk_window_move(GTK_WINDOW(widget), (w - window_w) / 2, (h - window_h) / 2);
}
void close_app(GtkWidget *widget, gpointer data) {
gtk_main_quit();
}
void button_leave(GtkWidget *button, gpointer data) {
printf("button leave\n");
}
void show_info(GtkWidget *widget, gpointer data) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(data),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,"Download Completed", "title");
gtk_window_set_title(GTK_WINDOW(dialog),"Information");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}
void button_pressed(GtkWidget *widget, gpointer data) {
printf("button pressed\n");
//show_info(widget,data);
//显示对话框
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(data), GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "系统提示", "你按下来按钮!");
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}
void button_clicked() {
printf("button clicked\n");
}
void toggle_button_callback(GtkWidget *toggle, gpointer data) {
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle))) {
//改变按钮的标签
gtk_button_set_label(GTK_BUTTON(toggle), "toggle button down");
}
else {
gtk_button_set_label(GTK_BUTTON(toggle), "toggle button up");
}
}
//使用gtk编译参数加上 `pkg-config --cflags --libs gtk+-2.0`
int main(int argc, char** argv) {
GtkWidget *widget;
GtkWidget *align;
初始化GTK环境
gtk_init(&argc, &argv);
//新建一个顶级窗口
widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//在show前初始化参数,//定义窗口的标题
gtk_window_set_title(GTK_WINDOW(widget), "我的第一个gtk程序!");
//设置窗口大小
gtk_window_set_default_size(GTK_WINDOW(widget), 400, 300);
//显示位置在鼠标位置
gtk_window_position(GTK_WINDOW(widget), GTK_WIN_POS_MOUSE);
//center001(widget);
//绑定信号函数,点击退出时执行的操作
g_signal_connect(GTK_OBJECT(widget), "destroy", GTK_SIGNAL_FUNC(close_app), NULL);
GtkWidget *button1;
// GtkWidget *button2;
GtkWidget *button3;
GtkWidget *Hbox;
GtkWidget *Vbox;
button1 = gtk_button_new_with_label("button1");
//button2 = gtk_button_new_with_label("button2");
button3 = gtk_button_new_with_label("关闭");
Hbox = gtk_hbox_new(TRUE, 0);
Vbox = gtk_vbox_new(TRUE, 0);
GtkWidget *table;
table = gtk_table_new(2, 2, TRUE);
//将两个按钮添加到表,button1占第一行的两个单元,button2占第二行的第一个单元
gtk_table_attach(GTK_TABLE(table), button1, 0, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
// gtk_table_attach(GTK_TABLE(table), button2, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
// gtk_container_add(GTK_CONTAINER(widget),table);
GtkWidget *toggle;
//新建一个按钮
toggle = gtk_toggle_button_new_with_label("toggle button up");
gtk_table_attach(GTK_TABLE(table), toggle, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
g_signal_connect(GTK_OBJECT(toggle), "toggled", G_CALLBACK(toggle_button_callback), NULL);
gtk_box_pack_start(GTK_BOX(Hbox), GTK_WIDGET(table), FALSE, FALSE, 0);
// gtk_box_pack_start(GTK_BOX(Hbox),button1,FALSE,FALSE,0);
// gtk_box_pack_start(GTK_BOX(Hbox),button2,FALSE,FALSE,0);
gtk_box_pack_start(GTK_BOX(Vbox), GTK_WIDGET(Hbox), FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(Vbox), button3, FALSE, FALSE, 0);
align = gtk_alignment_new(0.5, 0.5, 0, 0);
gtk_container_add(GTK_CONTAINER(align), Vbox);
gtk_container_add(GTK_CONTAINER(widget), align);
g_signal_connect(GTK_OBJECT(button3), "clicked", GTK_SIGNAL_FUNC(close_app), NULL);
//鼠标离开按钮时触发leave信号
g_signal_connect(GTK_OBJECT(button1), "leave", G_CALLBACK(button_leave), NULL);
//鼠标按下按钮时触发pressed信号
g_signal_connect(GTK_OBJECT(button1), "pressed", G_CALLBACK(button_pressed), NULL);
//鼠标松开是触发clicked信号
g_signal_connect(GTK_OBJECT(button1), "clicked", G_CALLBACK(button_clicked), NULL);
gtk_widget_show_all(widget);
gtk_main();
printf("ok\n");
return 0;
}