C ++开发GUI - 类?

时间:2008-12-11 22:51:57

标签: c++ user-interface winapi class

我不得不说我在C ++方面相当缺乏经验,不要对我太苛刻。

最近偶然发现了win32 API的奇迹并选择了练习使用它(我现在不想使用MFC / wxWidgets / etc,仅用于教育目的)。

嗯,我真正的问题是: 你如何正确地将你的win32 GUI内容编码到类中。我的意思是,当然,您可以创建一个保存单个窗口句柄的类,允许更轻松地修改窗口属性,具有更简化的CreateWindow()版本。但据我了解,你需要一个messagepump和几个回调函数为你创建的窗口。将它们与类组合时,它是如何工作的?

有人能指出我在正确的方向吗?我不介意阅读(很多)示例代码,只要它被评论。

PS:我也很难找到关于为我的窗户装饰使用'资源文件'的好文章(阅读:简单)。奖励点! :)

9 个答案:

答案 0 :(得分:4)

我用C ++编程以谋生。我喜欢C ++。

也就是说,如果你在.Net(例如C#)中使用Windows GUI,你的生活会变得如此简单。 Win32是非常低级的,你将构建大量的东西,你将免费使用.Net库。 Win32不再是一个奇迹了。 : - )

如果您想学习C ++,请选择GUI以外的其他内容。

答案 1 :(得分:2)

我个人会在这里使用MFC而不是重新发明轮子。但是,如果您坚持要求在程序运行时需要实例化的应用程序对象,并且包含消息循环和将消息转发到正确的窗口对象的机制。

这就是MFC的方式,至少。我不确定MFC源代码是否可供下载,但如果您可以访问Visual C ++安装盘(任何版本),您应该能够在计算机上安装源代码以进行查看。

答案 2 :(得分:1)

查看MFC或ATL / WFC。如果你想重新发明轮子,那么最好的参考来源就是轮子本身,特别是因为源代码随时可用。

答案 3 :(得分:1)

当我使用Win32 API(后来转向Linux和跨平台解决方案)时,我遇到的最大问题是回调。特别是winproc one,AKA的消息泵。我找到this,这应该是一个很好的提示。当我滚动自己的包装时,我做了那个页面建议的内容。

答案 4 :(得分:1)

我建议阅读Paul Dilascia的Windows++。它将指导您完成在Windows API之上构建C ++类库的整个过程。它是为16位Windows编写的,但本书中提出的所有概念仍然适用。另外,你可以把它变得非常便宜,因为它已经“过时了”。

并确保您了解消息破解程序(#include <windowsx.h>),它们会阻止您拔出太多头发。 ; - )

答案 5 :(得分:0)

我建议不要重新发明轮子的唯一原因是你既不是C ++专家也不是Win32 API专家。试图一次学习两个不相关的科目将不会有成效。如果你想在C ++上做得更好,可以为你熟悉的主题编写一个库。如果您想学习Win32 API,请在创建(或使用)包装器之前对其进行编程以了解其工作原理。

答案 6 :(得分:0)

Reliable Software网站上有一个非常好的C ++ Windows API教程。

答案 7 :(得分:0)

了解这一点的最好方法是去阅读查尔斯·佩佐尔德的原着。他很好地展示了如何设置基本消息循环以及如何构建语句以将各种事件路由到处理程序。这里真正的问题是,通过重新创建所有内容,您将花费数小时编写和调试Windows事件处理代码而不是编写自己的应用程序。

除非你有令人信服的理由自己这样做,否则你可以使用像MFC这样的其他人的构造来提供更好的服务。

我看到自己编码所有这些的唯一原因是,如果您想在切换到MFC或类似之前基本了解它的工作原理。至少通过这种方式,你可以看到它如何在封面下工作,然后才能永远忘记它。

答案 8 :(得分:0)

多年前,我开发了一组用于封装API的类(我们不能使用MFC的各种原因)。我从MFC源代码中学到了很多东西。

最重要的是,每个窗口都有一个UserInfo数据成员 - 您可以将它用于任何您想要的任何内容。您想要使用它的是该类的 this 指针。

现在,另一个棘手的问题是消息处理程序回调函数不能是普通的类成员函数,因为Windows使用C调用而不是C ++。所以你的回调必须是静态的。但是,由于您已经保存了类的 this 指针,因此只需获取类的userinfo,将其转换为类的this指针,然后调用所需的任何(非静态)类函数。

如果你正确计划,继承将很好用,包括windows本身展示的所有继承(即,Edit是一个Control是一个Window)。