【问题标题】:C++ developing a GUI - classes?C++ 开发 GUI - 类?
【发布时间】:2008-12-11 22:51:57
【问题描述】:

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

最近偶然发现了 win32 API 的奇妙之处并选择练习使用它(此时我宁愿不使用 MFC/wxWidgets/etc,仅用于教育目的)。

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

谁能在这里指出我正确的方向?只要有注释,我不介意阅读(很多)示例代码。

PS:我也很难找到关于将“资源文件”用于我的窗口装饰的良好(阅读:简单)文档。为此加分! :)

【问题讨论】:

    标签: c++ user-interface winapi class


    【解决方案1】:

    我以 C++ 编程为生。我喜欢 C++。

    也就是说,如果您在 .Net 中使用 Windows GUI,例如 C#,您的生活将会轻松得多。 Win32 是非常低级的,您将构建大量可以通过 .Net 库免费获得的东西。 Win32 不再是一个奇迹。 :-)

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        当我使用 Win32 API(后来转向 Linux 和跨平台解决方案)时,我遇到的最大问题是回调。尤其是 winproc 一,又名消息泵。我找到了this,这应该是一个很好的提示。当我推出自己的包装纸时,我按照该页面的建议进行了操作。

        【讨论】:

          【解决方案4】:

          查看 MFC 或 ATL/WFC。如果你想重新发明轮子,最好的参考来源就是轮子本身,尤其是因为源代码很容易获得。

          【讨论】:

            【解决方案5】:

            我建议阅读 Paul Dilascia 的 Windows++。它带您完成在 Windows API 之上用 C++ 构建类库的整个过程。它是为 16 位 Windows 编写的,但书中介绍的所有概念仍然适用。另外,因为它“过时”了,所以你可以很便宜地买到它。

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

            【讨论】:

            • 看起来也很有趣!我可能会考虑购买它。
            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              Reliable Software 网站上有一个相当不错的 C++ Windows API 教程。

              【讨论】:

                【解决方案8】:

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

                除非您有令人信服的理由自己这样做,否则使用其他人的构造(例如 MFC)会更好。

                我看到自己编写所有这些代码的唯一原因是,如果您想在切换到 MFC 或类似的东西之前对它的工作原理有一个基本的了解。至少通过这种方式,您可以在永远忘记它之前了解它是如何工作的。

                【讨论】:

                  【解决方案9】:

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

                  关键是每个窗口都有一个 UserInfo 数据成员——你可以将它用于任何你想要的。您想要使用它的是类的 this 指针。

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

                  如果你计划得当,继承会很好地工作,包括窗口本身展现的所有继承(即,编辑是控件是窗口)。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-04-12
                    • 2010-09-07
                    • 2014-11-15
                    • 2011-07-15
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多