我应该选择哪个Windows API来开发一个功能丰富的客户端应用程序?

6
我在 Mac OS X 和 Linux 上开发丰富的客户端软件。我希望将一个应用程序移植到 Windows 平台,但由于不使用 Microsoft 产品,对 Windows 不太熟悉。
我熟悉以下内容:
在 Mac OS X 上,我可以选择 Cocoa 和 Objective C 或 Carbon 和 C/C++。在 Linux 上,我可以选择 GTK+ 和 C/C++ 或 Qt 和 C++。我更喜欢 Mac OS X 上的 Cocoa 和 Linux 上的 GTK+。Cocoa 的 Interface Builder 和 GTK+ 的 Glade 让我的工作变得轻松。在这些操作系统中创建丰富的客户端很有趣。
我的核心类或 MVC 中的“模型”是用跨平台的 C++ 编写的。用户界面类或 MVC 中的“视图和控制器”是用各自平台上的“首选”语言和 GUI API 编写的。
C++ 是我最熟悉的语言。我广泛使用 Boost 库,特别是智能指针、线程和 asio 网络库。对于 Unicode、本地化等,我使用国际化组件 Unicode (ICU)。
问题1:Windows 平台上与我的跨平台模型类兼容的“首选”语言和 GUI API 是什么?
问题2:如何访问我的跨平台模型类?
例如,在 Mac OS X 上,我通过控制器类访问我的模型类。控制器类是用 Objective-C++ 实现的。Objective-C++ 是 C++ 和 Objective-C 的混合体。视图对象在 Objective-C 中“与”控制器对象交互,而控制器对象在 C++ 中“与”模型对象交互。
在 Linux 上,所有类都是用 C++ 实现的。
6个回答

4
在Windows平台上,实际上并没有“首选”语言和API,只有很多选择。明显的选择是直接使用原始Win32调用操作系统(因此只需要使用C调用),或在其上提供薄抽象(例如C++的WTL,Windows Template Library),或提供厚抽象(例如C++的MFC)。
现在微软正在大力推广WPF,但那是托管的.NET世界的一部分。你可以在其中编写C++代码,因此你可能能够移植你的应用程序,但我预计这将需要相当大的精力。
考虑到你在Linux平台上使用GTK+或QT,显而易见的选择是在Windows上使用这两者,因为它们都存在——这样你就可以使Linux和Windows版本几乎相同。它们并不是Windows-only应用程序的自然选择,因为它们最初并不来自Windows世界,但鉴于你的背景,它们是非常有意义的。你可能需要花些时间来调整它们,以使Windows应用程序看起来和感觉起来更合适,但这完全可以通过不需要编写全新的表示层来进行补偿。

4

Qt在Windows上运行良好。此外,它也是跨平台的。


2
如果您能使用Visual Studio工具链(而不是gcc或mingw)编译C++,我强烈建议您制作一个.lib文件,并将其链接到一个C++/CLI程序集中,从而向您的库公开托管API。
然后,您可以使用C#和WinForms API或WPF,拥有一个非常丰富和本地化的Windows外观应用程序。这项工作非常直接,如果您愿意重写GUI,它将获得最佳结果并且最容易部署。
其中一个注意事项是,如果您需要在可能没有.NET框架的计算机上运行它,则应坚持使用.NET 2.0(和WinForms)。您还应该让您的安装程序检测并安装它。如果您愿意在未安装.NET 3.5的情况下安装它,请选择WPF。

1

GTK+ 在 Windows 上运行得非常好。如果您已经熟悉它,那就用它吧。虽然性能可能不如本机 Windows UI 库(如 MFC),但除非您的应用程序真正依赖于 UI 性能,否则它已经足够好了。一个在所有平台上都使用 GTK+ 的大型示例是 Pidgin

没有看到代码,无法回答您的第二个问题,但我不认为它会与其他平台上的模型-视图-控制器方法有所不同。


没错,如果您可以保持跨平台,那么编写仅限于Windows的代码是没有用的。当然了,我更喜欢Qt而不是GTK+(没有性能开销或GUI不匹配!),但是问题已经提到喜欢GTK +,所以请继续使用它。 - Javier

1

Windows Presentation Foundation(WPF)是微软为Windows开发的新一代富应用程序标准。您可以将C++移植到它上面,但大多数人使用C#进行开发。


0

我倾向于使用Windows Presentation Foundation。我想这是微软对Mac OS X上的Cocoa的回应,因为“它旨在统一许多应用程序服务:用户界面、2D和3D绘图、固定和自适应文档、高级排版、矢量图形、光栅图形、动画、数据绑定、音频和视频。”这听起来像是Cocoa :-)

我想实现方式与我的Mac OS X实现类似:

  • 模型:跨平台C++类
  • 视图:WPF和C#
  • 控制器:C++/CLI或其他

而在Mac OS X上,视图类是用Objective-C实现的,而控制器类是用Objective-C++实现的。视图对象在Objective-C中“与”控制器对象交互,而控制器对象在C++中“与”模型对象交互。

在Windows上,C++/CLI是否像Mac OS X上的Objective-C++一样,或者C++/CLI中无法访问我定义的C#类?

从托管的.NET语言访问C++类的“正确”或“首选”方法是什么?


你可以将C#视图构建到一个程序集中,并调用另一个使用C++/CLI构建的程序集。你可以通过多种方式将跨平台的C++类构建到C++/CLI程序集中,例如将对象文件作为静态本机库进行链接,或者将源代码编译为托管代码。 - tragomaskhalos

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