【C语言】Windows上用GTK写GUI程序

要使用GTK开发一个Windows图形用户界面程序,需要首先设置GTK开发环境。这通常包括安装GTK库和它的依赖,以及配置编译器和工具链。可以选择使用纯C语言和GTK库或者使用支持GTK绑定的其他语言,如Python、C++或Rust。

1. 安装GTK开发库

在Windows上,这可以通过MSYS2这样的环境来完成。通过MSYS2安装GTK的步骤通常包括安装基础系统、更新包管理器、然后使用包管理器安装GTK。

可参考【C++】Windows编译FileZilla Client-CSDN博客

2. 创建一个新的C文件(例如gtk-test.c

写下以下代码:

#include <gtk/gtk.h>static void print_hello(GtkWidget *widget, gpointer data) {g_print("Hello World\n");
}static void activate(GtkApplication *app, gpointer user_data) {GtkWidget *window;GtkWidget *button;// 创建一个窗口window = gtk_application_window_new(app);gtk_window_set_title(GTK_WINDOW(window), "Window");gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);// 创建一个按钮,绑定点击事件button = gtk_button_new_with_label("Hello World");g_signal_connect(button, "clicked", G_CALLBACK(print_hello), NULL);gtk_window_set_child(GTK_WINDOW(window), button);// 显示窗口和按钮gtk_window_present(GTK_WINDOW(window));
}int main(int argc, char **argv) {GtkApplication *app;int status;// 创建一个GtkApplication实例app = gtk_application_new("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);status = g_application_run(G_APPLICATION(app), argc, argv);g_object_unref(app);return status;
}

3. 编译该程序

gcc `pkg-config --cflags gtk4` -o my-gtk-app gtk-test.c `pkg-config --libs gtk4`

`pkg-config` 命令用于自动检索GTK库的编译和链接标志。

4. 运行编译好的程序

 ./my-gtk-app.exe

当你执行这个程序时,应该会看到一个有“Window”标题的新窗口。请记住这只是一个非常基础的示例。实际上,开发一个丰满的Windows GUI程序还需要处理很多其他的事情,比如事件处理、布局管理、用户输入和更多。另外,如果你不想手动处理上述所有步骤,你可以使用一个集成的开发环境(IDE),比如 Microsoft Visual Studio 或者 GNOME Builder,这些IDE通常对GTK开发有更好的支持,并提供图形化辅助工具来简化开发过程。

5. 确保程序是作为“窗口应用程序(Windows Application)”编译

在Windows上使用GTK开发的应用程序通常会通过某种形式的兼容层进行编译,比如 MSYS2、Cygwin 或是直接在 Windows 上的 MinGW。如果在运行GTK程序时出现一个命令行窗口(通常是一个黑色的窗口),这可能是因为程序是作为控制台应用程序编译的。
要避免这种情况,需要确保你的程序是作为“窗口应用程序(Windows Application)”编译的,而不是作为“控制台应用程序(Console Application)”。在使用GCC编译器时,可以通过指定 -mwindows 链接器选项来实现这一点。这个选项告诉链接器正在创建一个窗口程序,它不应该分配一个控制台窗口。
以下是编译GTK Windows程序时的GCC命令示例:

gcc `pkg-config --cflags gtk4` -o my-gtk-app gtk-test.c `pkg-config --libs gtk4` -mwindows

在上面的命令中:
- pkg-config --cflags gtk4 获取GTK 4库相关的编译标志。
- pkg-config --libs gtk4 获取GTK 4库相关的链接标志。
- -mwindows 是防止控制台窗口出现的关键选项。
确保在编译时包含 -mwindows 选项,这样编译出来的程序在执行时就不会出现额外的命令行窗口。
如果你是使用其他构建系统(如CMake、Meson等)或集成开发环境(IDE),请确保在构建配置中也指定了相应的选项以生成窗口应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/590868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prototype原型模式(创建对象)

原型模式&#xff1a;Prototype 链接&#xff1a;原型模式实例代码 注解 模式定义 使用原型实例指定创建对象的种类&#xff0c;然后通过拷贝这些原型来创建新的对象。 ——《设计模式》GoF 目的 在软件系统中&#xff0c;经常面临这“某些结构复杂的对象”的创建工作&am…

Java ArrayList解密

数组的大小是固定的&#xff0c;一旦创建的时候指定了大小&#xff0c;就不能再调整了。也就是说&#xff0c;如果数组满了&#xff0c;就不能再添加任何元素了。 ArrayList 在数组的基础上实现了自动扩容&#xff0c;并且提供了比数组更丰富的预定义方法&#xff08;各种增删改…

论文阅读: AAAI 2022行人重识别方向论文-PFD_Net

本篇博客用于记录一篇行人重识别方向的论文所提出的优化方法《Pose-Guided Feature Disentangling for Occluded Person Re-identification Based on Transformer》&#xff0c;论文中提出的PDF_Net模型的backbone是采用《TransReID: Transformer-based Object Re-Identificati…

TypeScript 之 interface 和 type 的区别

结论&#xff1a; 1、可以声明的数据类型 type 可以修饰任何类型 &#xff08;值类型和引用数据类型&#xff09; interface 只能修饰引用类型 &#xff08;对象、数组、函数&#xff09; //interface 声明对象属性 interface ins {a: string;b?: number; //可选项 }// int…

HackTheBox - Medium - Linux - Encoding

Encoding 前言 经过10个月左右的网安自学&#xff0c;我想说的第一句话无疑是&#xff1a;感谢TryHackMe。当然&#xff0c;后续的HackTheBox&学院、CRTO等等&#xff0c;对我的帮助都很大。 许多师傅们都在年度总结&#xff0c;我也看了大家都收获很多&#xff0c;都很…

Docker容器基础知识点总结

一 、Docker架构 dockers加速镜像&#xff1a; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://z90yxq2m.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restar…

MySQL基础学习: linux系统mysql 密码插件 validate_password安装

1、没有安装mysql密码插件&#xff0c;执行命令&#xff1a;SHOW VARIABLES LIKE ‘validate_password%’; 2、安装mysql密码插件&#xff0c;执行命令&#xff1a;install plugin validate_password soname ‘validate_password.so’; 3、再次执行&#xff1a;SHOW VARIABLE…

【Unity入门】MenuItem 和 ContextMenu 的使用方法

目录 一、ContextMenu描述使用示例ContextMenuItem使用示例 二、MenuItem描述使用示例 三、MenuItem 和 ContextMenu 的区别 一、ContextMenu 描述 ContextMenu 属性用于向上下文菜单添加命令。 在该附加脚本的 Inspector 中&#xff0c;当用户选择该上下文菜单时&#xff0c…

【Spring实战】16 Profile

文章目录 1. 定义2. 使用2.1 定义 Profile2.2 激活 Profile 3. 演示3.1 properties文件3.2 打印日志3.3 启动服务&验证3.4 修改 active3.5 重启服务&验证 4. 应用场景4.1 数据库配置4.2 日志配置 5. 代码详细总结 Spring 框架提供了一种强大的机制&#xff0c;允许在不…

docker 在线安装mysql 8.0.21版本

1、拉取mysql 8.0.21版本镜像 2、查看镜像 docker images 3、在宿主机 /usr/local/mysql 下的 conf 文件夹下&#xff0c;创建 my.cnf 文件&#xff0c;并编辑内容 [mysql] default-character-setutf8 [client] port3306 default-character-setutf8 [mysqld] port3306 se…

普中STM32-PZ6806L 使用FlyMcu串口烧录程序

简介 我的串口下载电路坏掉了, 所以研究了下如何通过USB转TTL进行程序的下载, 为后续Bootloader部分做准备;连接 我的板几乎是十年前买的&#xff0c; 所以电路与现有网上的资料有些差异, 所以仅供参考 USB 转 TTL线 与开发板 连接&#xff0c; 如图图中 ①, 需要去掉第一个…

YOLOv8训练损失、mAP画图功能 | 支持多结果对比,多结果绘在一个图片(科研必备)

一、本文介绍 本文给大家带来的是YOLOv8系列的绘图功能&#xff0c;我将向大家介绍YOLO系列的绘图功能。我们在进行实验时&#xff0c;经常需要比较多个结果&#xff0c;针对这一问题&#xff0c;我写了点代码来解决这个问题&#xff0c;它可以根据训练结果绘制损失(loss)和mA…

python实现平滑线性滤波器——数字图像处理

原理&#xff1a; 平滑线性滤波器是一种在图像处理中广泛使用的工具&#xff0c;主要用于降低图像噪声或模糊细节。这些滤波器的核心原理基于对图像中每个像素及其邻域像素的线性组合。 邻域平均&#xff1a; 平滑线性滤波器通过对目标像素及其周围邻域像素的强度值取平均来工…

Openwrt修改Dropbear ssh root密码

使用ssh工具连接路由器 输入&#xff1a;passwd root 输入新密码 重复新密码 设置完成 rootImmortalWrt:~# passwd root Changing password for root New password:

dll文件和exe文件的区别和关系

dll文件 DLL(Dynamic Link Library)文件为动态链接库文件&#xff0c;又称"应用程序拓展"&#xff0c;是软件文件类型。在Windows中&#xff0c;许多应用程序并不是一个完整的可执行文件&#xff0c;它们被分割成一些相对独立的动态链接库&#xff0c;即DLL文件&…

【前缀和】【分类讨论】【二分查找】2983:回文串重新排列查询

作者推荐 【动态规划】【字符串】C算法&#xff1a;正则表达式匹配 本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 二分查找算法合集 回文串重新排列查询 给你一个长度为 偶数 n &#xff0c;下标从 0 开始的字符…

QT上位机开发(绘图软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 稍微复杂一点的软件&#xff0c;一般都是带有绘图功能。绘图的意义&#xff0c;不仅仅是像CAD一样&#xff0c;可以进行模型的设计、比对和调试。它…

爬虫实战-微博评论爬取

简介 最近在做NLP方面的研究&#xff0c;以前一直在做CV方面。最近由于chatgpt&#xff0c;所以对NLP就非常感兴趣。索性就开始研究起来了。 其实我们都知道&#xff0c;无论是CV方向还是NLP方向的模型实现&#xff0c;都是离不开数据的。哪怕是再先进的代码&#xff0c;都是…

数据结构--队列【详解】~(˶‾᷄ꈊ‾᷅˵)~

目录 队列定义&#xff1a; 队列的声明与头文件的包含&#xff1a; 队列的声明&#xff1a; 头文件的包含&#xff1a; 队列的基本操作: 初始化队列 : 摧毁队列&#xff1a; 入队列&#xff1a; 出队列&#xff1a; 返回队头数据&#xff1a; 返回队尾数据&#xff1…

Node.js使用jemalloc内存分配器显著减少内存使用

前言 Node.js 默认使用的是 ptmalloc(glibc) 内存分配器&#xff0c;而&#xff1a; 在服务端领域「不会选择默认的 malloc」是一个常识。&#xff08; 来源 &#xff09; ptmalloc 的分配效率较低&#xff08; 来源 &#xff09;&#xff0c;对于 长时间、多核 / 多线程 运行…