gtk+笔记
安装gtk+
sudo apt-get install libgtk3.0*
sudo apt install libgtk-3-dev
HelloWord
main.c
#include <gtk/gtk.h>
int main( int argc, char *argv[] )
{
/* GtkWidget 是构件的存储类型 */
GtkWidget *window;
/* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/
gtk_init (&argc, &argv);
/* 创建一个新窗口 */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* 最后一步是显示新创建的窗口 */
gtk_widget_show (window);
/* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里
* 等待事件 (如键盘事件或鼠标事件) 的发生。*/
gtk_main ();
return 0;
}
编译:
gcc main.c `pkg-config --libs --cflags gtk+-2.0`
#如果是使用gtk3.0
#gcc main.c `pkg-config --libs --cflags gtk+-3.0`
执行:
./a.out
打开文件对话框
在windows下:
#include <windows.h>
#include <Shlobj.h>
#include <tchar.h>
#include <Commctrl.h>
#pragma comment(lib, "comctl32.lib")
int main()
{
LPITEMIDLIST pil = NULL;
INITCOMMONCONTROLSEX InitCtrls = { 0 };
TCHAR szBuf[4096] = { 0 };
BROWSEINFO bi = { 0 };
bi.hwndOwner = NULL;
bi.iImage = 0;
bi.lParam = NULL;
bi.lpfn = NULL;
bi.lpszTitle = _T("请选择文件路径");
bi.pszDisplayName = szBuf;
bi.ulFlags = BIF_BROWSEINCLUDEFILES;
InitCommonControlsEx(&InitCtrls);//在调用函数SHBrowseForFolder之前需要调用该函数初始化相关环境
pil = SHBrowseForFolder(&bi);
if (NULL != pil)//若函数执行成功,并且用户选择问件路径并点击确定
{
SHGetPathFromIDList(pil, szBuf);//获取用户选择的文件路径
wprintf_s(_T("%s"), szBuf);
}
return 0;
}
在Ubuntu下的代码为:
#include <gtk/gtk.h>
void select_file()
{
GtkWidget *dialog;
//dialog = gtk_file_selection_new("文件选择对话框"); //这条和下边的区别有待考察
dialog=gtk_file_chooser_dialog_new("SelectFile",NULL,GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,NULL);
if(gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT)
{
char *filename;
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
printf("file name is : %s \n", filename);
}
gtk_widget_destroy(dialog);
}
int main(int argc,char **argv)
{
gtk_init(&argc,&argv);
select_file();
return 0;
}
GTK+介绍
GTK+是创建图形化用户接口的库,使用C语言创建,也可以使用C++,Python,Perl,Java,C#来创建。
GTK+依赖以下的库:
- Glib
- Pango
- ATK
- GDK
- GdkPixbuf
- Cairo
编译GTK+应用
使用pkg-config会返回被安装库的元数据,如果我们使用一个指定的库,它会帮助我们提供必要的库和我们需要的库。
gcc -o simple simple.c `pkg-config --libs --cflags gtk+-2.0`
cflags参数输出要编译的GTK+程序的每个处理器和编译标志:
$ pkg-config --cflags gtk+-2.0 | xargs -n3
-pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include
-I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0
-I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2
-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1
-I/usr/include/libpng12 -I/usr/include/harfbuzz
libs参数列举了必要的库文件:
$ pkg-config --libs gtk+-2.0 | xargs -n5
-lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0
-lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfontconfig
-lgobject-2.0 -lglib-2.0 -lfreetype
GTK版本
version.c
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
g_printf("GTK+ version: %d.%d.%d\n", gtk_major_version,
gtk_minor_version, gtk_micro_version);
g_printf("Glib version: %d.%d.%d\n", glib_major_version,
glib_minor_version, glib_micro_version);
return 0;
}
第一个GTK+程序
样例程序
创建一个基本窗口:
simple.c
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
GtkWidget *window; //所有GTK+部件的基础类,他管理部件的生命周期,状态和样式。
gtk_init(&argc, &argv); //初始化GTK+并解析一些标准命令行选项。
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);//创建一个顶级窗口
gtk_widget_show(window);
g_signal_connect(window, "destroy",
G_CALLBACK(gtk_main_quit), NULL); //给窗口对象绑定一个回调函数,并传递一个destroy信号,
gtk_main(); //进入GTK+主循环
return 0;
}
gcc -o simple simple.c `pkg-config --libs --cflags gtk+-2.0`
居中窗口
center.c
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Center");
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_widget_show(window);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_main();
return 0;
}
应用图标
icon.c
#include <gtk/gtk.h>
GdkPixbuf *create_pixbuf(const gchar * filename) {
GdkPixbuf *pixbuf;
GError *error = NULL;
pixbuf = gdk_pixbuf_new_from_file(filename, &error);
if (!pixbuf) {
fprintf(stderr, "%s\n", error->message);
g_error_free(error);
}
return pixbuf;
}
int main(int argc, char *argv[]) {
GtkWidget *window;
GdkPixbuf *icon;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Icon");
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
icon = create_pixbuf("web.png");
gtk_window_set_icon(GTK_WINDOW(window), icon);
gtk_widget_show(window);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
g_object_unref(icon); //析构图标
gtk_main();
return 0;
}
工具提示
tooltip.c
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *button;
GtkWidget *halign;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Tooltip");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
gtk_container_set_border_width(GTK_CONTAINER(window), 15); //设置边界空间
button = gtk_button_new_with_label("Button");
gtk_widget_set_tooltip_text(button, "Button widget"); //设置提示语
halign = gtk_alignment_new(0, 0, 0, 0); //对齐方式为左上角
gtk_container_add(GTK_CONTAINER(halign), button); //设置子部件button的对齐方式
gtk_container_add(GTK_CONTAINER(window), halign); //设置窗口的主容器
gtk_widget_show_all(window); //显示所有窗口和部件
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
gtk_main();
return 0;
}
菜单和工具栏
菜单栏逻辑图
菜单栏样例
simplemenu.c
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *menubar;
GtkWidget *fileMenu;
GtkWidget *fileMi;
GtkWidget *quitMi;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
gtk_window_set_title(GTK_WINDOW(window), "Simple menu");
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
menubar = gtk_menu_bar_new();
fileMenu = gtk_menu_new();
fileMi = gtk_menu_item_new_with_label("File");
quitMi = gtk_menu_item_new_with_label("Quit");
gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu);
gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi);
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(quitMi), "activate",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
参考链接:
https://www.cnblogs.com/libra13179/p/12531758.html
https://blog.csdn.net/SeaTalks/article/details/53130088