Windows环境下使用GTK

2023-11-20

一、前言

维基百科:GTK(原名GTK+)最初是GIMP的专用开发库(GIMP Toolkit),后来发展为Unix-like系统下开发图形界面的应用程序的主流开发工具之一。GTK是自由软件,并且是GNU计划的一部分。自2019年2月6日起,GTK+改名为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+ 教程 · ZetCode 中文系列教程 · 看云

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. 显示表格

GTK+ 2.0 Tree View Tutorial

#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;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows环境下使用GTK 的相关文章

  • 将JAVA程序作为计划任务运行

    我试图在 Windows 7 机器上每天运行一次简单的 JAVA 程序 我的代码在 NetBeans 中运行良好 如果我进行清理并构建 它会表明 C Program Files Java jdk1 7 0 bin java jar C Us
  • 如何在没有驱动的情况下从USB读取数据?

    我们正在创建带有 GPS 接收器和 PC 的小型系统 我们想测试我的 GPS 接收器 我们不想一开始就找司机 首先我想测试我的电路是否工作 GPS IC 已设置为输出 NMEA 语句 我们想要一个只从 USB 端口读取数据并将其打印在屏幕上
  • Android Studio 0.8.2 URI 有一个权限组件

    我收到 Gradle 项目同步失败 消息 当我启动 Android Studio 时 当我尝试清理项目时 我收到 无法完成 Gradle 执行原因 URI 具有权限组件 我已经尝试了几件事 但仍然陷入困境 我将配置文件从用户文件夹中移出 并
  • 作为 Windows 服务运行时,Tomcat 7 控制台和/或托盘图标不显示

    我已将 Tomcat7 安装为服务 service bat 它作为服务启动并运行良好 但当您使用 Tomcat7 exe 或startup bat 手动启动服务器时 我看不到通常出现的控制台 顺便说一句 我在 Windows 7 上 我从这
  • SQL Server Express(或任何版本)可以在 RPi 上运行吗?

    我注意到完整版的 Windows 10 可以在 RPI 3 上运行 我想知道 SQL Server Express 或任何其他版本 是否可用于 ARM 版本的 Windows 我在任何地方都看不到它 所以我怀疑答案是否定的 但想检查一下我是
  • 最后一个参数中的正斜杠会导致批处理文件目录(“%~dp0”)的路径发生更改

    我正在学习如何在批处理脚本中使用参数 并最终创建了某种用于读取参数和设置参数的模板 echo off SetLocal EnableDelayedExpansion set needextra set errstat set noflag
  • 在菜单中显示 gtk.Calendar?

    我想构建一个上下文菜单 其中包含用于选择日期的菜单项 用例是在树视图中选择一堆项目 然后为所有项目设置新的截止日期 由于菜单项是 Gtk Bin 因此我可以指定任何小部件来代替标签 然而 我似乎无法interact与小部件 如果我单击菜单上
  • robocopy 脚本:系统资源不足

    我有一个之前可以运行的脚本 一个机器人复制脚本 备份服务器坏了 新的服务器丢失了一些配置 但我不是 Windows 用户 脚本如下 C Windows system32 Robocopy F Equipos NASSERVERBACKUP
  • 获取已创建进程的进程句柄 Windows

    我需要获取运行程序时刚刚创建的所有进程的句柄或 PID 到目前为止 我已经使用了这段代码 每次创建进程时都会告诉我 问题是我只获取有关创建的进程的信息 但没有有关进程本身的任何信息 https msdn microsoft com en u
  • 如何在 NERDTree 中显示隐藏文件(以句点开头)?

    我怎样才能使NERDTree https github com scrooloose nerdtree显示以 a 开头的文件 时期 我有一个名为 hgignore在项目目录中 如果我使用 NERDTree 浏览到该目录 该文件不会显示在树中
  • 为什么我的文件路径中出现 Unicode 转义的语法错误? [复制]

    这个问题在这里已经有答案了 我想要访问的文件夹名为 python 位于我的桌面上 当我尝试访问它时出现以下错误 gt gt gt os chdir C Users expoperialed Desktop Python SyntaxErro
  • 在 Windows 2008 上将 myprogram.exe 作为服务运行时出现问题

    MyProgram exe 是用来侦听来自管道的请求并使用命令提示符使其工作完美 但我尝试使用 Windows 服务来工作但没有成功我在 Windows Server 2008 Enterprise 上尝试了以下步骤 gt sc creat
  • Python 可执行文件:py2exe 还是 PyInstaller?

    要创建可执行文件 Windows 我假设我们应该使用其中之一 Py2exe 或 PyInstaller 它们之间有什么区别 Py2exe 和 PyInstaller 都是包装器 但我注意到以下几点差异 Py2exe 与 python2 4
  • 批处理文件 FOR /f 标记

    任何人都可以逐行准确解释以下代码是如何工作的 我真的迷路了 我一直在尝试学习如何使用 FOR 命令 但我不明白这一点 echo off for f tokens delims f in myfile do set line f call p
  • 用于验证 IIS 设置的 Powershell 脚本

    是否可以使用 Power Shell 脚本获取 IIS 设置 我希望使用脚本获取 检查以下信息 检查 Windows 身份验证提供程序是否正确列出 协商 NTLM 检查是否启用了 Windows 身份验证 Windows 身份验证高级设置
  • 设置 Form.KeyPreview = true 的缺点?

    我想知道 Form KeyPreview 属性实际上有什么用处 它为什么存在以及将其设置为 true 会带来什么 风险 我想它一定有some负面影响 否则它根本不应该存在 或者至少默认情况下是正确的 EDIT 我很清楚what确实如此 我问
  • 在 Cygwin 软件包列表中找不到 Openssl

    这里说的是https github com joyent node wiki Building node js on Cygwin Windows https github com joyent node wiki Building nod
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 如何将 GIT 调用的输出获取到批处理脚本中的变量中?

    我有一个 git 命令来获取当前存储库的最新 SHA 如下所示 git log pretty format H n 1 我有一个 Windows 批处理脚本 我想按如下方式使用它 SET CURRENT SHA 但我不知道如何将从 git

随机推荐

  • fatal error C1083: 无法打开包含文件:“iostream.h”: No such file or directory

    刚开始用Visual studio net 2003 一个这样的例子 新建了一个win 32项目 include stdafx h include
  • 使用Mask-RCNN在实例分割应用中克服过拟合

    点击上方 AI公园 关注公众号 选择加 星标 或 置顶 作者 Kayo Yin 编译 ronghuaiyang 导读 只使用1349张图像训练Mask RCNN 有代码 代码 https github com kayoyin tiny in
  • 【react】回调函数形式的ref

    回调函数有3个特点 是我定义的函数 我没有调用这个函数 在我没有调用的情况下这个函数自己执行了 ref绑定一个箭头函数作为回调函数 可以输出以下这段看下 ref绑定的箭头函数是会自己执行的 class Demo extends React
  • 关于运发的知识点123(个人笔记 持续更新)

    前言 作为一个物联网的小辣鸡 硬件设计水平不能说没有 只能说一点点 正好要做新项目 自己学着去处理信号 滤波 在这里做一点笔记 参考书一 杨建国老师 新概念模拟电路 pdf 参考书二 单电源运放图集 pdf 原版 翻译中文版 注 想要的自己
  • redis配置 -详情-redis.config

    Redis config 启动的时候 就通过配置文件来启动 单位 配置文件 unit单位 对大小写不敏感 不区分大小写 INCLUDES 包含 include path to local conf include path to other
  • 加糖的CRM---开源项目Sugar CRM中文化安装过程

    目前CRM满天飞 一直也没什么兴趣 好象从几百万美刀到几百块的都有 这次试了试安装Sugar CRM 把安装过程梳理了一下 记下来 以下在环境为windows XP sp2 IIS5 1 MYSQL4 18 PHP5 0下安装成功 首先是要
  • 如何修改NuGet默认全局包文件夹的位置?

    由于一些历史原因 重装系统成为Windows用户解决疑难杂症的祖传手艺 受此影响 给硬盘分区几乎成为了一种执念 少则C D两个盘 夸张一点的5 6个盘的也不是没有 PS macOS和Linux一直都不鼓励给磁盘分区 虽然不禁止但也不提倡 随
  • webpack基础配置

    webpack基础配置 关键字记录 module exports require entry main mode development production output filename path publicPath devServe
  • Git高级之配置多个SSH key

    最近我们在代码托管平台上使用SSH的方式下拉代码 通常是用一个ssh key来拉取所有托管平台的代码 如码云 GitHub GitLab等 但是总用一个不是太好 会有安全风险 这就需要为每个托管平台设置单独的SSH key 下面我们下简单介
  • tensorRT-lenet C++代码分析【附代码】

    前面的文章中已经写了一个tensorRT简单的demo lenet推理 tensorRT lenet 实现了从torch模型转wts 同时也展示出了wts内网络的详细信息 再转engine后的推理过程 本文章是在之前的基础上去分析C 代码的
  • 约瑟夫环生死小游戏-报数下船

    30 个人在一条船上 超载 需要 15 人下船 于是人们排成一队 排队的位置即为他们的编号 报数 从 1 开始 数到 9 的人下船 如此循环 直到船上仅剩 15 人为止 问都有哪些编号的人下船了呢 totalNumber 30 总共人数 n
  • 【网络】传输层-UDP协议

    文章目录 UDP报文格式 UDP协议特性 无连接 不可靠 面向数据报 UDP缓冲区 UDP特性对于编程的影响 基于UDP的应用层协议 netstat工具 pidof命令 UDP报文格式 查看Linux系统下的 usr include net
  • 使用opencv实现简单的人脸识别

    一 opencv模块的使用 1 简介 opencv python是一个python绑定库 旨在解决计算机视觉问题 使用opencv模块 可以实现一些对图片和视频的操作 2 安装 安装opencv之前需要先安装numpy matplotlib
  • kubernetes RC 与 Deployment ,Pod,Horizontal Pod Autoscaling ,replica set资源

    Pod Pod是 kubernetes 的最基本的操作单元 包含一个或多个紧密相关的容器 kubernetes 使用pod在容器之上再封装一层 其一个很重要的原因是 docker容器之间的通信受到docker网络机制的限制 在docker中
  • 华为OD机试真题- Linux发行版的数量【2023Q1】【JAVA、Python、C++】

    题目描述 Linux操作系统有多个发行版 distrowatch com提供了各个发行版的资料 这些发行版互相存在关联 例如Ubuntu基于Debian开发 而Mint又基于Ubuntu开发 那么我们认为Mint同Debian也存在关联 发
  • C++11新特性:四种类型转换cast说明

    目录 引言 1 static cast 1 1 基本类型转换 1 2 类的上行转换 安全 1 3 类的下行转换 不安全 2 const cast 2 1 改变常量属性 3 dynamic cast 3 1 类的上行转换 安全 3 2 类的下
  • <Linux开发>驱动开发 -之- Linux LCD 驱动

    Linux开发 驱动开发 之 Linux LCD 驱动 交叉编译环境搭建 Linux开发 linux开发工具 之 交叉编译环境搭建 uboot移植可参考以下 Linux开发 之 系统移植 uboot移植过程详细记录 第一部分 Linux开发
  • 碎碎念之工作②

  • [Transformer] PVT系列:PVT & CPVT & Twins

    PVT Pyramid Vision Transformer A Versatile Backbone for Dense Prediction without Convolutions 论文 https arxiv org abs 210
  • Windows环境下使用GTK

    一 前言 维基百科 GTK 原名GTK 最初是GIMP的专用开发库 GIMP Toolkit 后来发展为Unix like系统下开发图形界面的应用程序的主流开发工具之一 GTK是自由软件 并且是GNU计划的一部分 自2019年2月6日起 G