使用C语言进行GUI编程介绍

15

我对GUI和编程整体都是新手,目前对C语言有一个大致的了解,并花费了相当多的时间编写控制台应用程序。

我正在尝试学习GUI,但到目前为止没有成功。我已经尝试学习wxWidgets(通过官方文档)、GTK(通过官方文档)和Win32(通过forge的Win32教程),但还没有完全掌握。

我仍然很想学习GUI,但似乎找不到任何好的资料。 作为初学者,你会推荐什么起点呢?


1
使用C的要求有多严格?你能不能考虑使用C++呢? - Magnus Hoff
坚持下去,与一些语言相比,在C语言中编写GUI并不容易。 - Liran Orevi
对于从谷歌搜索进入此处的任何人,实际上树莓派出版社有一本免费书籍涉及此主题:https://www.raspberrypi.org/magpi/issues/c-gui-programming/ - user1086516
10个回答

15
如果你只能使用C语言,那么选择就很有限了。对于初学者来说,GTK+可能是最容易的选择。
面向对象的语言例如C++更适合GUI编程。如果你喜欢使用C++,我强烈推荐Qt,主要是因为它有非常好的文档,并且特别适合初学者的tutorials

4
考虑到问题中提到已经尝试过gtk,如果没有提供破解这个难题的提示,推荐gtk就是多余的。另外,建议更换语言也不是重点。面向对象语言并不更适合GUI编程,因为面向对象只是一种设计实践,不是某些特定语言才有的魔法。 - mlibby
真的吗。那么你认为C语言同样适合GUI编程?请继续用C编写你的GUI程序,我不会阻止你。那么对于想要做一些GUI编程的初学者,你有什么建议? - Gunther Piez
Gtk+。从我的回答中可以看出,我不知道为什么sil3nt选择了C(显然是在Windows上),但他/她一定有理由。我认为对于一种语言的坚持优于另一种语言会分散注意力。如果在这一点上语言选择确实是一个开放的问题,我建议C#是一个Windows程序员进入GUI编程的最佳方式。 - mlibby
1
VisualBasic并不比C更面向对象,但任何人都可以使用它来编写GUI应用程序。如果没有编写工具包使得与它们的接口在C中几乎不可能(Qt / Cocoa)或者只是不适用于现代GUI编程(WinAPI),那么这将是易如反掌的。至少对于GUI代码而言,转移到C ++和Objective C的建议可能是有效的。 - user14554

5
我不建议使用C语言来做GUI。这样做并不是很方便。但如果你真的想要尝试,这里有一个非常好的Windows API教程。
你也可以使用像Allegro这样的库,它专门用于游戏,但在程序中同样有用。
但我建议的方法是,首先学习基本的GUI和应用程序(即状态机)编程,使用一种简单的语言(任何简单的都可以,个人建议使用带有Löve2D平台的Lua)。然后再将所学的知识应用到C语言中。如果你需要处理垃圾回收和指针,状态机和事件流可能会更难理解...(但仍然可以学习)。

返回翻译后的文本:-1因为问题不是GUI应该用C完成,而是如何开始。有很多使用Gtk+编写的精细软件可以在跨平台上运行。 - mlibby
1
这个问题涉及到“你会建议初学者从哪里开始学习编程?”因此,除了回答问题的其余部分之外,加上一个警告是非常好的建议。 - Dipstick
@mcl:我知道有很多用C编写的GUI软件,也有用汇编语言编写的GUI应用程序。但我认为这不是学习GUI的最佳方法。对于初学者来说,首先学习像Lua(例如Löve2D平台)这样的东西会更有益,因为您不必担心垃圾回收、指针和其他类似的问题。当您了解GUI的基本事件/状态模型时,后续学习会更容易。 - Egon
1
从我的经验来说,我认为找一个用你选择的编程语言和GUI工具包编写的简单应用程序是学习GUI编程的绝佳方法。我曾经用GTK编写了一个C语言的Mandelbrot集合绘图器,并将其移植到了GTK2并实现了新功能(因此也有了新的对话框等)。关键在于找到一个相对简单的应用程序,你有足够的信心去掌握它,以添加或修改它。 - James Morris
Meh对 Allegro 给出了加1的评价,但是他已经说过Forger不起作用了,所以对于推荐Forger给他,他给出了减1的评价。 - porque_no_les_deux

4
我建议您尝试学习一些面向对象编程,使用Objective C或C++等语言进行学习,因为GUI编程很困难。特别是在C语言中更加困难。
GUI编程中的许多概念都围绕着您了解对象的工作方式展开,其中包括任何GUI框架中组成的所有小部件以及它们之间的交互。还有一个事件的概念,它可以将消息从一个输入源发送到图形组件(或者在两个图形组件之间进行传递)。
总之,当您知道对象的全部内容时,阅读文档会变得更加容易……即使如此,需要掌握的内容仍然很多。

2
如果你想学习在Windows平台上使用C语言进行GUI编程,好消息是本地API都是基于C语言的。坏消息是本地API并不是一个非常清晰和一致的模型。因此,最好从建立在该API之上的面向对象框架开始入手会更容易些。

话虽如此,如果你仍然想学习使用C语言进行Windows GUI编程,Petzold的Programming Windows是你最好的选择。它将教你通用的Windows编程知识,包括所有GUI相关内容,使用本地API。


2
我建议回到gtk+并更加尝试。为什么呢?
因为Linux和Windows都有大量的开源软件,使用gtk+库编写GUI界面。从像GIMP和GnuCash这样的大型应用程序到较小的工具,它们的源代码都是可用的,您可以阅读以了解它们如何完成某些功能。它们是否提供了最佳实践来完成某些事情是另一个问题,但至少您可以看到工作软件是如何做到的。
此外,gtk+包括glib,这是一个方便的工具,可用于处理常见的数据结构和算法。因此,您可以使用库中的链表等数据结构,而无需花费时间实现它们,您的编码时间将用于解决自己特定的难题。
Gtk+文档并不完美,但还算不错。还有一个邮件列表供应用程序开发人员使用。

1
除了GTK+,还可以使用Glade3界面设计工具。您只需拖放小部件即可构建GUI表单。Glade会生成.glade文件,该文件可以导入到您的C代码中。有关更多信息,请访问http://glade.gnome.org/。 - atv

1
阅读一本书只能让你有所了解。要想进一步提高,你需要尝试使用API进行实验。虽然你可以深入到Win32 API级别来设计你的GUI,但如果你刚开始学习,就应该专注于尝试不同的技术。
你很快就会发现什么有效,什么无效。
如果我要推荐一本书,我会推荐一本非技术性的书籍。

日常物品的设计

接下来是一个视频播客,关于更多心理学概述的GUI设计和如何让你的用户和你自己感到满意。

软件业务 - Joel Spolsky

最后,这本书将帮助你理解,当你设计应用程序时,人们会通过他们自己的文化价值观来看待你的审美决策和选择。因此,选择一个审美设计主题并坚持下去非常重要。

文化代码


1
需要了解的是,GUI并没有内置于C语言中(正如您无疑已经发现的那样),但是可以通过各种库进行添加。wxWindows、qt、gtk和当然还有VCL都是主要的玩家。虽然它们都做着类似的事情,但在细节上却各不相同。
需要知道的一件重要的事情是,如果您使用C++编程,您将可以访问这些和其他库的一些面向对象的包装器,这可能会使您的生活变得更加轻松。如今,“纯”C有时被看作是“老派”的,支持也不太“活跃”,尽管现有的GUI库本身就非常出色。
我建议您浏览互联网以获取GUI库的描述和比较,并根据个人需求评估您的发现。您的东西只能在Windows上运行,还是希望它跨平台?许可证是否成为问题?您想要小而简单(也许不那么性感)还是想要结束所有GUI的GUI?
选择一个赢家后,请通过在线教程或示例进行学习。如果您能够掌握其要点并能够按照所需的风格进行编程,请抓住一本纸质书籍深入学习并详细理解它。

1
+1 给GTK。如果你必须使用C语言,无论是出于自己的选择还是项目需求,那么你很难找到比GTK+更好的选择。QT主要是C++,所以如果可以使用C++,那也是一个选项。但是,就开源项目而言,GTK+的文档并不太糟糕,并且有很多示例代码可供参考。
如果你可以选择其他编程语言,那么还有其他选择。Cocoa是Mac上优秀的GUI编程环境(我从未尝试过在Windows上使用Cocoa,但听说这是可能的),Objective-C非常适合GUI编程。

1

我建议你也学习事件驱动编程。在许多GUI程序中,主程序等待事件发生,比如鼠标点击,然后处理该事件。事件驱动编程与顺序执行编程有很大的区别。

其他需要学习的主题是多线程和多任务编程。许多GUI对象(小部件),比如按钮,向其他对象传递消息;或广播给所有侦听器。消息传递是多线程和多任务编程中常见的过程。


0

我推荐使用Cimg库,这是一个开放源代码的库,在2D图形界面和图像处理中非常有用:

CImg库是一个开源的C++图像处理工具包,旨在实现以下特性:实用性——CImg定义了简单的类和方法,旨在操作您自己的C++代码中的通用图像:加载/保存各种文件格式、访问像素值、显示、调整大小/旋转/镜像/过滤、绘制基本图形(文本、面孔、曲线、3D对象等)、计算统计数据、管理用户交互等。泛化性——提供的图像类可以表示高达4维宽度的数据集(从1D标量信号到3D高光谱体积),具有模板像素类型。还支持图像集合和序列。可移植性——CImg是自包含的,因此高度可移植。它完全适用于不同的操作系统(Unix、Windows、MacOS X、*BSD)和各种C++编译器(Visual C++、GNU g++、Intel icc、Borland bcc等)。简洁性——CImg轻巧。它由一个单一的头文件CImg.h组成,必须包含在您的C++源代码中。它仅定义了四个不同的类。它可以使用最小的标准C++和系统库进行编译。无需外部或复杂的依赖关系。可扩展性——虽然不是必需的,但CImg可以使用外部工具/库的功能,如ImageMagick、GraphicsMagick、XMedCon、FFMPEG、libpng、libjpeg、libtiff、Magick++、Lapack、Board、OpenEXR或FFTW3。此外,一个简单的插件机制允许任何用户根据自己的需要直接增强库的功能。自由——CImg是一个自由的开源库,根据CeCILL-C(接近GNU LGPL)或CeCILL(与GNU GPL兼容)许可证分发。它可以用于商业应用程序。

这是关于Cimg的文档。


因为篇幅过长而被投票否决。有时候,开源并不是学习阅读代码的最佳方式。它可能会让你对真正编写的软件应该是什么样子产生扭曲的看法。 - Chad
@Chad Cimg是我见过的最简单的图形库。你看过Cimg库吗? - Sajad Bahmani
1
@Chad,你还有什么其他建议可以学习真正的编写软件的样子?至少在开源项目中,阅读代码是一个选择。阅读任何代码都比只是冒险进入虚空并不得不从头开始解决问题或只使用书籍和教程中的琐碎示例要好。 - mlibby
3
我看到的最大问题是它是C++而不是OP所问的C语言... - Remo.D
在C++语言领域,我会推荐John Carmack的Quake 3引擎,它主要是用C语言编写的。接下来我会推荐Half life 2 SDK。Adobe开源产品(虽然我不太愿意推荐)。我之所以推荐任何商业软件产品而不是开源软件,是因为文化差异和文化价值观的原因。提到商业产品的原因是因为它们很成功,并且这些代码已经在数百万台机器上运行过!这本身就是一种优势。 - Chad
@mcl,冒险进入未知领域并从头开始探索没有任何问题。这很有趣,你会学到非常快的课程,否则需要数月时间才能从书本中获得。虽然我建议使用stackoverflow +冒险,因为你可以在指尖获取大量知识。不过,请不要误解我的评论。我主要是出于文化价值原因,推荐商业软件产品而不是开源软件。然后使用stackoverflow与教程并自己拓展,使学习更加有趣。 - Chad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接