GTK+系列---第一个空窗口程序

为了开始介绍GTK,我们将从一个简单的基于信号的GTK应用程序开始。该程序将创建一个空的200×200像素窗口。

步骤如下:

图1:

图2: 

 

  1. 打开MSYS2软件,输入mkdir -v demo1命令,在用户目录下创建项目文件夹
  2. 继续在命令行中输入touch example-0.c,新建一个C语言文件
  3. 用Notepad++编辑器(或其他编辑器,或在MSYS2中用VIM打开,需先在MSYS2中安装vim包)打开example-0.c文件,文件路径从图中可知,为MSYS2软件安装的目录+图中所示的路径,即:G:\Msys2\home\Drson\demo1。G:\Msys2为你安装软件时设置的安装路径;home\Drson\为你的MSYS2的用户文件夹,如图1中绿色字体@前面的部分为用户名;demo1为你在步骤1中创建的文件夹。
  4. 如图2,输入如下代码,保存
  5. 在MSYS2中输入gcc `pkg-config --cflags gtk+-3.0` -o example-0 example-0.c `pkg-config --libs gtk+-3.0`命令,编译程序。注意:命令中的(`)为英文输入时的反引号,位置在Esc按键下,1按键的左边。
  6. 在MSYS2中输入./example-0,运行编译好的程序,你就会看见文章开头的截图了!!!

如何编译GTK+应用程序?

要编译GTK+应用程序,需要告诉编译器在哪里可以找到GTK+头文件和库。pkg-config就是这样的效果。下面的交互式shell会话演示如何使用pkg-config(系统上的实际输出可能不同):

上图的命令输出的是gcc的编译选项和头文件路径 

上图的命令输出的是程序需要链接的库文件 

编译程序的最简单方法是使用shell的“backticks”特性。如果用反引号(不是单引号)括住命令,则在执行之前,它的输出将被替换到命令行中。 所以编译上面的自己写的程序时,只要输入(gcc `pkg-config --cflags gtk+-3.0` -o example-0 example-0.c `pkg-config --libs gtk+-3.0`)命令就可以了。

已弃用的gtk+函数会被注释,以使编译器在使用它们时发出警告。(例如,对于gcc,您需要使用 -Wdeprecated-declarations选项)。如果这些警告存在疑惑,可以通过使用命令行选项-DGDK_DISABLE_DEPRECATION_WARNINGS,通过定义预处理器符号GDK_DISABLE_DEPRECATION_WARNINGS来关闭它们。

GTK+取消预测注释版本化;通过定义宏GDK_VERSION_MIN_REQUIRED和GDK_VERSION_MAX_ALLOWED,您可以指定要使用其API的GTK+版本的范围。在此范围之前弃用或之后引入的API将触发编译器警告。

代码解析

所有GTK+应用程序都将包括gtk/gtk.h,它声明GTK+应用程序所需的函数、类型和宏。即使GTK+安装了多个头文件,第三方代码也只能直接包含顶级的gtk/gtk.h头文件。如果直接包含任何其他头,编译器将中止并返回错误。

在GTK+应用程序中,main() 函数的目的是创建一个GtkApplication对象并运行它。在本例中,将调用名为app的GtkApplication类型的指针,然后使用gtk_application_new()初始化该指针。创建GtkApplication对象时,您需要选择一个应用程序标识符(名称)并将其作为gtk_application_new()的参数输入。对于本例,使用org.gtk.example,但对于为应用程序选择标识符,请参阅下面章节(应用程序标识)。最后,如果您的应用程序有特殊需求,gtk_application_new()会将GApplicationFlags作为您应用程序的输入。

接下来,激活信号连接到main()函数上方的activate()函数。当您的应用程序使用下面一行中的g_application_run()启动时,将发送激活信号。gtk_application_run()也将指向命令行参数counter和string数组的指针作为参数;这允许GTK+解析控制GTK+自身行为的特定命令行参数。解析后的参数将从数组中删除,留下无法识别的参数进行解析。

在g_application_run中,发送activate()信号,然后我们进入应用程序的activate()函数。在activate()函数内部,我们要构建我们的GTK窗口,以便在启动应用程序时显示一个窗口。对gtk_application_window_new()的调用将创建一个新的GtkWindow并将其存储在窗口指针中。窗口将具有框架,标题栏和窗口控件,具体取决于平台。

使用gtk_window_set_title()设置窗口标题。此函数将GtkWindow *指针和字符串作为输入。由于我们的window指针是GtkWidget指针,我们需要将其强制转换为GtkWindow *。但不是通过(GtkWindow *)转换window ,而是可以使用宏GTK_WINDOW()来转换window 。在转换之前,GTK_WINDOW()将检查指针是否是GtkWindow类的实例,如果检查失败则发出警告。最后,使用gtk_window_set_default_size设置窗口大小,然后GTK通过gtk_widget_show_all()显示窗口。退出窗口时,例如按下“X”,主循环中的g_application_run()将返回一个保存在名为“status”的整数内的数字。然后,使用g_object_unref()从内存中释放GtkApplication对象。最后返回状态整数并退出GTK应用程序。

程序运行时,GTK +正在接收事件。这些通常是由用户与您的程序交互引起的输入事件, 也包括来自窗口管理器或其他应用程序的消息。GTK +处理这些信号,因此可能会在您的构件上发出信号。连接这些信号的处理程序通常是如何使程序响应用户输入而做一些事情的。

应用程序ID

GNOME技术广泛地为应用程序使用“反向DNS”样式的标识符。在开发应用程序时,首先需要做的事情之一是选择适当的标识符。这种标识符的一个例子是“org.gnome.gedit”。应用程序标识符被广泛使用,更改它们可能会导致问题。因此,您应该仔细地选择标识符,并着眼于应用程序的未来。

应用程序ID用于以下位置:

  • 通过GtkApplication(或GApplication)作为识别系统应用程序的方法,确保在给定时间只运行一个应用程序实例,并将消息传递给您的应用程序(例如打开文件的指令)
  • 通过D-Bus,在消息总线上命名您的应用程序。这是应用程序之间通信的主要方式,可通过gdbus命令行工具或d-feet图形D-Bus浏览器查看。
  • 作为您的应用程序的“.desktop文件”的名称。此文件是您向系统描述应用程序的方式(以便它可以在gnome-shell中显示和启动)。
  • 作为应用程序可能安装的任何GSettings架构的基本名称。通过gsettings命令行工具或dconf-editor图形编辑器可以看到这些名称。
  • 作为系统记住有关应用程序的状态信息的一种方式(例如,它已请求向用户显示哪些通知)并作为控制应用程序设置的一种方式(例如,如果用户已阻止其通知)
  • 作为系统使用您的应用程序扩展自身的一种方式(例如,通过搜索提供程序)
  • 作为应用程序包的包名称

制作有效应用程序ID的准确规则如下:

  • 应用程序ID必须由两个或多个元素组成,这些元素由句点(“.”)字符分隔
  • 每个元素必须包含一个或多个字母数字字符(A-Z, a-z, 0-9),下划线 ('_'),连字符 ('-') ,且不能以数字开头
  • 空字符串不是有效元素(即:您的应用程序ID不能以句点开头或结尾,并且连续两个句点无效)
  • 整个ID的长度必须少于255个字符

选择一个名称最重要的是它必须是全局唯一的。如果两个不相关的应用程序尝试使用相同的应用程序ID,则会发生错误。因此,强烈建议基于全局公共DNS系统选择一个名称。例如,如果您拥有域yorba.org,您可能希望将应用程序命名为“myapp”,如“org.yorba.myapp”。如果您的应用程序与一个给定的免费软件项目紧密关联,那么使用该项目的公共DNS名称是合适的。在这种情况下,“强关联”通常意味着“使用相关项目的版本控制、错误跟踪等”。例如,宿主在git.gnome.org中的应用程序通常使用“org.gnome.myapp”这样的名称。不要将“org.gnome.”作为应用程序ID的一部分,除非您的项目托管在gnome.org上。有时无法基于您拥有的域选择ID。在这种情况下,通常可以退回到合理的地方,例如公共提供者的帐户名。例如“com.github.username.myapp”或“com.gmail.mymailaddr.myapp”就是这些名称的示例。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值