Windows环境下使用GTK
本文详细介绍VS2020如何配置GTK开发环境,以及使用教程。
一、前言
维基百科:GTK(原名GTK+)最初是GIMP的专用开发库(GIMP Toolkit),后来发展为Unix-like系统下开发图形界面的应用程序的主流开发工具之一。GTK是自由软件,并且是GNU计划的一部分。自2019年2月6日起,GTK+改名为GTK。
二、下载地址
已编译好的GTK文件下载地址:
也可以按照官网的方式使用MSYS2进行安装:
The GTK Project - A free and open-source cross-platform widget toolkit
三、VS环境配置
Step1 解压GTK文件到本地
本文使用32位的gtk+3.6.4,解压后文件如下图,根目录设置为Gtk
Step2 添加bin文件夹到环境变量
Windows ==>> 设置 ==>> 系统 ==>> 关于 ==>> 高级系统设置 ==>> 环境变量 ==>> 点击Path ==>> 新建 ==>> 输入bin 文件夹路径 ==>> 确定
Step3 配置Gtk本地环境
输入代码(注意Gtk文件所在位置):
pkg-config --cflags gtk+-3.0
pango-querymodules > D:\Gtk\etc\pango\pango.modules
gdk-pixbuf-query-loaders > D:\Gtk\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache
gtk-query-immodules-3.0 > D:\Gtk\lib\gtk-3.0\3.0.0\immodules.cache
Step4 新建VS项目
#include <gtk/gtk.h>
int main(int argc, char* argv[]) {
GtkWidget* window;
GtkWidget* label;
gtk_init(&argc, &argv);
/* create the main, top level, window */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* give it the title */
gtk_window_set_title(GTK_WINDOW(window), "Hello World");
/* Connect the destroy signal of the window to gtk_main_quit
* When the window is about to be destroyed we get a notification and
* stop the main GTK+ loop
*/
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
/* Create the "Hello, World" label */
label = gtk_label_new("Hello, World");
/* and insert it into the main window */
gtk_container_add(GTK_CONTAINER(window), label);
/* make sure that everything, window and label, are visible */
gtk_widget_show_all(window);
/* start the main loop, and let it rest there until the application is closed */
gtk_main();
return 0;
}
Step5 添加头文件夹
项目 ==>> GtkTest属性 ==>> 配置属性 ==>> C/C++ ==>> 常规 ==>> 附加包含目录
D:/Gtk/include
D:/Gtk/include/atk-1.0
D:/Gtk/include/cairo
D:/Gtk/include/freetype2
D:/Gtk/include/glib-2.0
D:/Gtk/include/gtk-3.0
D:/Gtk/include/libpng15
D:/Gtk/include/pixman-1
D:/Gtk/include/gdk-pixbuf-2.0
D:/Gtk/lib/glib-2.0/include
Step6 添加库文件夹
项目 ==>> GtkTest属性 ==>> 配置属性 ==>> 链接器 ==>> 常规 ==>> 附加库目录
D:/Gtk/lib
Step7 添加库文件
项目 ==>> GtkTest属性 ==>> 配置属性 ==>> 链接器 ==>> 输入 ==>> 附加依赖项
atk-1.0.lib
cairo.lib
fontconfig.lib
gailutil.lib
gdk_pixbuf-2.0.lib
gdk-win32-3.0.lib
gio-2.0.lib
glib-2.0.lib
gmodule-2.0.lib
gobject-2.0.lib
gthread-2.0.lib
gtk-win32-3.0.lib
pango-1.0.lib
pangocairo-1.0.lib
pangoft2-1.0.lib
pangowin32-1.0.lib
Step8 运行
隐藏控制台的方法:
项目右键 -> 属性 -> 配置属性 -> 链接器 ->
系统 -> 子系统 -> 窗口(/SUBSYSTEM:WINDOWS)
高级 -> 入口点 -> mainCRTStartup
四、使用教程
gtk学习总结:GTK从入门到放弃,三天包教包会_rtoax的博客-CSDN博客_gtk
gtk3基础知识的学习(C语言)_小陌白的博客-CSDN博客_gtk3
附录 使用示例
1. 显示图片
#include<gtk/gtk.h>
int main(int argc, char* argv[]) {
GtkWidget* window;
GtkWidget* frame;
GtkWidget* image;
GdkPixbuf* pixbuf;
//这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中
gtk_init(&argc, &argv);
//建立主窗口
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//设置窗口标题和大小
gtk_window_set_title(GTK_WINDOW(window), "Demo");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
//从文件中建立pixbuf像素缓冲区
pixbuf = gdk_pixbuf_new_from_file("1.png", NULL);
//从像素缓冲区中建立图像
image = gtk_image_new_from_pixbuf(pixbuf);
//释放缓冲区
g_object_unref(pixbuf);
//创建框架
frame = gtk_frame_new("this is a picture");
//将图像加入框架
gtk_container_add(GTK_CONTAINER(frame), image);
//将框架加入窗口
gtk_container_add(GTK_CONTAINER(window), frame);
//窗口退出事件添加回调函数
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
//显示窗口
gtk_widget_show_all(window);
//所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里 等待事件 (如键盘事件或鼠标事件) 的发生。
gtk_main();
return 0;
}
2. 显示表格
#include <gtk/gtk.h>
enum
{
COL_NAME = 0,
COL_AGE,
NUM_COLS
};
// GtkTreeModel用于保存数据
static GtkTreeModel*
create_and_fill_model(void)
{
GtkListStore* store;
GtkTreeIter iter;
store = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_UINT);
/* 添加一行数据 */
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COL_NAME, "Heinz El-Mann",
COL_AGE, 51,
-1);
/* 再添加一行数据 */
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COL_NAME, "Jane Doe",
COL_AGE, 23,
-1);
/* 再添加一行数据 */
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COL_NAME, "Joe Bungop",
COL_AGE, 91,
-1);
// 返回树模型
return GTK_TREE_MODEL(store);
}
// GtkTreeView用于数据的显示
static GtkWidget*
create_view_and_model(void)
{
GtkCellRenderer* renderer;
GtkTreeModel* model;
GtkWidget* view;
view = gtk_tree_view_new();
/* --- 第一列 --- */
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
-1,
"Name",
renderer,
"text", COL_NAME,
NULL);
/* --- 第二列 --- */
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
-1,
"Age",
renderer,
"text", COL_AGE,
NULL);
model = create_and_fill_model();
gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
/* The tree view has acquired its own reference to the
* model, so we can drop ours. That way the model will
* be freed automatically when the tree view is destroyed */
g_object_unref(model);
return view;
}
int main(int argc, char** argv)
{
GtkWidget* window;
GtkWidget* view;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "delete_event", gtk_main_quit, NULL); /* dirty */
view = create_view_and_model();
gtk_container_add(GTK_CONTAINER(window), view);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)