【@.1 MVVM设计模式与Glade】

做上层软件开发的程序员可能对于MVVM模式比较熟悉,这是一种经典的软件设计模式,很好的将用户界面与后台处理之间分层开,通过属性、事件绑定这种统一的"接口"将软件重新组装起来,将原本看上去很混乱很冗余的软件开发流程抽象出来,以一种统一而又合理的思想来组织软件开发。下面截自wiki的一幅图简单说明了MVVM模式的组织结构。

View层提供了人机交互界面,Model层则是处理实际逻辑操作、数据操作的核心,二者之间由ViewModel层来进行协调,即绑定(Binding)View层的操作和属性,请求Model执行并得到反馈结果。

MVVM模式在Windows平台下的WPF开发得到了很好的体现,而WPF开发中View层并不是用C代码,而是用XAML来描述的,这是以前的传统软件开发或是MFC开发中所没有的。在实际使用这种WPF开发时可以用Expression Blend来进行UI设计,这个软件专门而且仅仅生成一个XAML文件用于界面描述,而底层的逻辑代码直接连到Visual Studio中进行编写。通过Blend画出的界面可以很好的释放你的创造力想象力,而其跟Visual Studio之间的无缝连接将MVVM模式演绎的淋漓尽致。因此我开始考虑有没有一种更通用的工具,不仅仅局限于Windows平台,能在多数平台下用MVVM模式进行开发。于是我发现了Glade与GTK的配合。

GTK是一个以纯C语言开发的图形库,同样适用于跨平台开发中。对于做底层开发比较多的人来说看到纯C代码比较亲切,我也一直想用纯C,而不是Visual Studio中提倡的C#,进行软件开发。单独使用GTK非常棒,但是一个问题就在于,需要手写的代码太多了。画一个按键,按键的布局,按键的事件,这些都需要自己一行行手写,而且还得留意代码的顺序。而其中一个我觉得是很大的门槛在于,布局需要盲打,即,你只能先在脑中有个界面的想法,写好代码后才能看到界面的结果。当然对于嵌入式设计中的很多界面设计都是盲打,比如uCGUI,但是如果有一个工具能像Visual Studio之类的集成开发环境一样能画界面,再生成代码,那开发的速度将大大提升。Glade就很好的解决了这一问题。

Glade很像Expression Blend的作用,它仅仅生成一个xml文件,描述了界面是怎样布局的,界面上需要绑定那些事件(Signal)。通过Glade+GTK开发的程序每次在运行时都会解析这个xml文件生成一个界面(是不是跟WPF一样~),main函数里的代码量大大减少,所需要的就是新建一个builder,解析这个xml,传给gtk中的窗口类型,再显示这个窗口,之后进入Gtk的主循环即可。

但是,Glade+GTK劣势于Blend的一个关键特性是,不支持属性绑定。虽然GTK中的Glib在2.26以后就增加了GBinding,也就是属性绑定的支持,但是在Glade中却并没体现出属性绑定的设置,至少不能像Blend一样,每一个属性都可以方便的设置绑定。在C代码中手动编写代码来进行绑定或许可以实现(有待测试),但是官方教程上并没有这一特性介绍,也没有像Blend中那样强调属性绑定的重要性。这一特性的缺失导致Glade+GTK实现的MVVM有所残缺。这篇文章的作者在进行向Glade和GTK中增加Binding的实现,可以参考他对于binding的描述。不知道现在进展如何了。

不过话说回来,就算没有属性绑定也能写出一个好的界面出来不是?

【@.2 软件准备】

开发时所需的工具很简单,下面分开说明(也可以参考文章末尾打包好的所有模块下载):

1.Gtk。由于Gtk是跨平台的图形界面库,因此对于windows下的Gtk不见得是最新版本的,但是其功能也足够我们使用了。在这个页面中可以找到Windows平台下的Gtk库,我下载的时候windows版本的gtk只有2.24版本。除开源代码,每个模块有两个下载分支,一个是Dev也就是开发时所需库和头文件,另一个是Run-time的动态链接库。编译好的Gtk程序仅需将run-time的库解压到运行程序相同文件夹(或者可自己配置),即可将程序发布。如果觉得一个个模块下载麻烦,可以下载all-in-one bundle,包含了Run-time和Dev版本。下载后解压到任意位置即可,比如c:\gtk\下,编译时需要向环境变量中的PATH添加c:\gtk\bin就可以了。

2.Glade。在官方网站可以下载到windows平台下的glade。需注意下载的glade版本与gtk版本是否匹配,我下载时glade3.8.x版本支持gtk 2版本,3.14.x支持gtk 3版本。由于前面下的gtk版本是2.24,这里下载glade需3.8.3版本。

3.需要一个在windows下的GNU编译器,也就是MinGW。我在这篇博客中详细介绍了Windows下配置MinGW的方法,同样也有配置完整的打包下载,可以参考自行配置这里不再累述。

4.一个文本编辑器。系统自带的文本编辑器就可以了,不过为了编辑代码方便,windows下我还是推荐Notepad++来编辑,请自行google下载最新版本即可。当然为了有一个完整的IDE,可以使用Eclipse配置一个完善的开发环境,不过这里为了保持问题的简洁性暂且不考虑采用Eclipse。

【@.3 程序实例】

保证所有软件下载安装完成,即

Gtk解压,比如解压到C:\gtk\。

Glade安装结束。

MinGW配置可用。如果你采用前面提到我自行配置的MinGW注意仅需解压即可,比如解压到C:\MinGW\

关于Glade的教程,可以参考下面链接:

GTK+ and Glade3 GUI Programming Tutorial

但是需注意的是,这篇教程中的源代码在Windows下编译后不能很好的运行(也就是所有的事件不能正常绑定),并且其中的Glade版本比较低,用Glade生成的界面文件与我们的主程序代码联系在一起的步骤有变,所以仅仅参考其Glade的界面设计步骤即可。

打开glade,在左侧的Toplevels中新建一个Window,右侧的属性中将name改为mainWindow。一般在GTK设计中需要新增一个Container来进行布局的调整,这里为了演示方便,就简单的拖动一个按钮在界面上就好了。将按钮名字改为button_Click。

下面新建两个事件(Signal)。在mainWindow中右侧属性栏切换到Signals一栏,找到GtkObject下的destroy,在Handler下选择on_mainWindow_destroy,这将作为这个控件销毁,也就是窗口关闭时的发出的信号。

另外一个按键的类似,切换到右侧属性栏的Signals,找到GtkButton中的clicked,选择Handler为on_button_Click_clicked。这个作为点击按钮发送的信号。

保存这个界面设计为,比如Tutor1.glade,在任意目录下。

在同一目录下新建一个main.c文件,输入如下代码

#include <gtk/gtk.h>
//Add G_MODULE_EXPORT to signal function prototype is important in Windows!!!
//#define  G_MODULE_EXPORT   __declspec(dllexport)
static unsigned int clkcount;
G_MODULE_EXPORT void on_mainWindow_destroy(GtkObject *object, gpointer user_data)
{g_print("Quit Here!");gtk_main_quit();
}
//G_MODULE_EXPORT must be add!!
G_MODULE_EXPORT void on_button_Click_clicked(GtkObject *object, gpointer user_data)
{clkcount++;g_print("  **Button Clicked!**  %d\n",clkcount);}int main (int argc, char *argv[])
{GtkBuilder    *builder;GtkWidget     *window;//
   clkcount=0;//
   gtk_init(&argc, &argv);builder = gtk_builder_new();gtk_builder_add_from_file(builder, "Tutor1.glade", NULL);//
   window = GTK_WIDGET(gtk_builder_get_object(builder, "mainWindow"));//add the top window in the glade code
   gtk_builder_connect_signals(builder, NULL);g_object_unref(G_OBJECT(builder));//
   gtk_widget_show(window);gtk_main();return 0;
}

这既是运行一个Glade+GTK设计出的界面程序的最小代码,可以看到主函数里面的代码量相比于单纯用Gtk来编写少了许多。

注意到前面新建的两个信号,on_mainWindow_destroy和on_button_Click_clicked前面都加了G_MODULE_EXPORT进行修饰。这是一个宏,在代码注释中写出了这个宏的展开。如果不加它,则最后编译出的运行程序将会找不到对应的事件(handler)。之后需要编译。同文件夹下新建一个build.bat,输入如下代码(假设gtk安装在c:\gtk\bin下,并且MinGW的路径为c:\MinGW\bin)

@echo off
::Set GTK for compile and runtime libs
set PATH=C:\gtk\bin;%PATH%
set PATH=c:\MinGW\bin;%PATH%
(pkg-config --cflags --libs gtk+-2.0 )>temp
set /p pkg=<temp
del temp
::gcc -Wall -mwindows -g -o main main.c %pkg%
gcc -Wall -g -o main main.c %pkg%

编译成功后,如果不在同文件夹下放置所有的运行库,则程序将无法运行。这时候最简单的就是将所有运行库dll解压到同文件夹下即可运行(文章末尾打包文件中有),另一种方法是写一个脚本设置运行库的路径之后再运行程序。可以新建一个launch.bat,输入如下代码

@echo off
set PATH=c:\gtk\bin;%PATH%
start main.exe

即可运行。

下面是所用到程序的打包,其中包含了例程以及必要脚本

gtk2-glade3-win32.7z

转载于:https://www.cnblogs.com/apollius/archive/2013/04/16/3022816.html

Windows平台下Glade+GTK开发环境的搭建相关推荐

  1. Windows平台下NS2网络仿真环境的搭建

    NS2(Network Simulator 2) 是一种针对网络技术的源代码公开的.免费的软件模拟平台,研究人员使用它可以很容易的进行网络技术的开发,而且发展到今天,它所包含的模块几乎涉及到了网络技术 ...

  2. Webots平台下NAO机器人仿真环境的搭建

    Webots平台下NAO机器人仿真环境的搭建 一.前期准备 Webots-8.6.2(版本在R2019前(不包含R2019)均可) Choregraphe(我使用的是最新版本) naoqi环境 二.W ...

  3. Windows平台下Mediasoup客户端开发指南

    操作系统:Windows 10 IDE: Visual Studio 2019 GitHub:https://github.com/versatica/libmediasoupclient/ 官网文档 ...

  4. Windows平台上iPhone基于cygwin开发环境的搭建方法

    cygwin 開發平台(windows版 iPhone SDK) http://www.iphonetw.net/books/unofficialdev/cygwintoolchain Windows ...

  5. Window平台下的Android的环境配置

    Android环境配置 在本文写作时,Android SDK版本已经为2.2.现在我们来看一看在Windows平台下Android环境的配置步骤: 在配置之前需要下载的软件包如下: JDK 1.6+ ...

  6. Windows下安装Object C开发环境,及Hello Word(转)

    Windows下安装Object C开发环境,及Hello Word 最近想学习iphone开发,但是由于没有c基础,只有java基础.所以先从基础学习,首先是搭建环境,目前手头没有mac机子,只能先 ...

  7. Windows平台下Makefile学习笔记

    来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开发,但我还没安 ...

  8. windows系统中eclipse C开发环境的架设

    虽然c有很多经典的开发环境,但是大多数是linux或unix下的,对于windows的忠实用户来讲,可能并不习惯. windows环境中,有一个dev-c++可以做c代码的调试,但这个软件貌似已经停止 ...

  9. php生鲜超市系统,毕业论文:基于PHP平台下的Ajax开发实践—网上生鲜超市系统的开发...

    毕业论文:基于PHP平台下的Ajax开发实践-网上生鲜超市系统的开发 发表时间:2013-5-8 12:17:49 大学学士毕业论文 基于PHP平台下的Ajax开发实践 --网上生鲜超市系统的开发 专 ...

最新文章

  1. “波士顿动力机器人”离上战场又近了一步,逆天了!
  2. 极客新闻——16、数据库设计中的5个常见错误
  3. mysql 区分大小写(大小写敏感)配置
  4. Java实现栅格数据格式文件读取及加法操作
  5. android服务的说法错误的是,下面关于Android开发描述有误的一项是()。
  6. 爬虫笔记:爬虫的基本原理
  7. 如何定义开发完成?(Definition of Done)
  8. 40行代码AC_HDU 1575 TrA 矩阵快速幂(附快速幂+矩阵快速幂的讲解)
  9. BIM+GIS应用实战(听课笔记)
  10. python代码块注释快捷键_pycharm默认注释与快捷键功能
  11. go语言中的方法method
  12. Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
  13. mysql的连接名是哪个文件_mysql连接名是什么
  14. React 入门学习笔记2
  15. oracle的基本概念,oracle的基本概念
  16. 考拉RPC(koalas-rpc v1.0)源码
  17. 【C语言】判断学生成绩等级
  18. 代码里配置java代理
  19. sqlserver中某列转成以逗号连接的字符串及逆转、数据行转列列转行
  20. R2: 相关系数、复相关系数及半偏相关系数之间的联系

热门文章

  1. android pdf 插件,Pdf文件查看 android原生插件
  2. Halcon焊点检测例子解析
  3. 微信小程序上传云函数_HBuilderx适用
  4. 2022-2028年中国邮轮游行业竞争现状及投资决策建议报告
  5. 浅谈人工智能(`AI`)基础知识
  6. 计蒜客 卡牌游戏 (区间DP)
  7. 网上,手机上.流行滴谜语!
  8. 从现在开始也许还不晚
  9. 100集华为HCIE安全培训视频教材整理 | 双机热备(一)
  10. TVP尖峰对话李开复沈春华:AI未来进行式与技术的发展