我为富客户端应用程序选择哪种Windows API?

时间:2008-11-12 14:31:30

标签: c++ windows visual-c++ cross-platform

我在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 ++是我最熟悉的语言。我广泛使用Bo​​ost库。特别是智能指针,线程和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 个答案:

答案 0 :(得分:4)

Windows上没有真正的“首选”语言和API,更像是很多选择。显而易见的是直接到操作系统的原始Win32调用(所以实际上只是C调用),或者在它之上的简单抽象(例如WTL,Windows模板库,它是C ++),或者更粗的抽象(例如MFC,也是C ++)。

微软现在正在推动相当强大的WPF,但这是托管.NET世界的一部分。你可以用它来编写C ++,这样你就可以移植你的应用程序了,但是我希望它能够付出很大的努力。

鉴于您在Linux上使用GTK +或QT,显而易见的是在Windows上同时使用这两者,因为两者都存在 - 这样您就可以保持Linux和Windows版本几乎相同。它们不是Windows应用程序的天生选择,因为它们最初不是来自Windows世界,但鉴于您的背景,它们会有很多意义。您可能需要花一些时间来调整它们以使Windows应用程序外观和感觉恰到好处,但是由于不需要编写全新的表示层,这应该得到补偿。

答案 1 :(得分:4)

Qt适用于Windows。此外,它与平台无关。

答案 2 :(得分: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。

答案 3 :(得分:1)

GTK +在Windows上运行良好。如果您已经熟悉它,那就是我使用的。虽然性能可能与本机Windows UI库(如MFC)的性能不匹配,但除非您的应用程序真的依赖于性能,否则它就足够了。在所有平台上使用GTK +的一个重要例子是Pidgin

在没有看到某些代码的情况下无法真正回答您的第二个问题,但我不明白为什么它与其他平台上的模型 - 视图 - 控制器方法不同。

答案 4 :(得分:1)

Windows Presentation Foundation(WPF)是Windows的新Microsoft富媒体应用程序标准。你的C ++将移植到它,但是大多数人都会开发C#。

答案 5 :(得分: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#类我定义在C ++ / CLI中无法访问?

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