【问题标题】:is windows presentation foundation available to c++ developers?c++ 开发人员可以使用 Windows 演示文稿基础吗?
【发布时间】:2010-12-15 15:44:06
【问题描述】:

我阅读了有关窗口演示基础的信息并得到了一本书

Windows 演示文稿基础 释放出来。

但令我惊讶的是,代码是用 c# 编写的。

问题:

c++ 开发人员可以使用 wpf 吗?如果不是为什么。谢谢

【问题讨论】:

  • 我并不感到惊讶,它是 MS 最流行的语言。

标签: c++ wpf


【解决方案1】:

.NET 当然可以与C++/CLI 一起使用,并且它也应该扩展到 WPF。

【讨论】:

  • 再次注意,C++/CLI 与 C# 的共同点多于与 C++ 的共同点。 +1。
  • 当然,但您也可以注意到 C# 和 C++ 在语法和语义方面也有很多共同点。所以呢?只要它有助于在不产生太多问题的情况下完成工作,我认为这很好。
  • 我想补充一点,C# 基本上与 C++ 非常相似。如果您了解 C++,C# 将是轻而易举的学习。主要变化仅在于处理内存和对象的方式(使用垃圾收集器,而不是 new/delete 并且没有隐式自动变量,这只会简化事情)。还有更多的语法糖,但除此之外几乎相同。因此,它比 C++ 更容易处理,而且需要担心的问题更少。所以不要害怕!
  • 并非如此。在 C++ 中,您可以拥有诸如析构函数之类的东西。在 CLR 上,您不能。 (CLR 确实有类似的东西,称为“终结器”,但它们与析构函数完全不同,因为析构函数是确定性的,终结器不是)C++/CLI 还鼓励使用反射之类的东西,并包含由CLR,并且没有 C++ 的模板功能(仅限 C# 类泛型)。它真的是使用 C++ 语法的 C#,而不是 C++。
  • @Billy ONeal:通常,CLR 是否具有析构函数并不重要。 Assembly 也没有它们,这并没有阻止 C++ 编译器。只有当您假设 GC 和析构函数可以混合时,它才会中断。另外,C++/CLI does have templates
【解决方案2】:

WPF 是为托管环境而构建的,因此如果您想在 WPF 中使用本机 C++,将会遇到障碍,您必须混合使用非托管代码和非托管代码。但实际上,.NET 语言是使用 WPF 的首选方式。

见:WPF and Win32 Interoperability

【讨论】:

  • 嗯,WPF 和 Win32 可以互操作,但是原生代码仍然无法控制 WPF。这里支持的互操作只是在 WPF 段内嵌入一个 Win32 窗口并传递一个本机代码可以使用的HWND。但是你肯定不会在 C++ 中得到像 XAML 这样的东西。
【解决方案3】:

如果 C++ 开发人员使用托管 C++,则可以使用 WPF。

【讨论】:

  • 没有支持 WPF 的“托管 C++”版本(最后存在于 Visual Studio 2005 中)。 C++/CLI 支持它,但更像 C# 而不是 C++。
【解决方案4】:

C++ 无法与 WPF 交互,因为 WPF 是一种基于托管代码的技术。 WPF 的主要设计目标是围绕 CLR 的事件系统、反射特性和对象框架构建的。

  • 在 WPF 应用程序中,您可以使用 XAML 文件构造对象图。运行时使用反射将 XAML 中的特定元素绑定到真实对象以在运行时实例化。这不能在 C++ 中完成,因为 C++ 不支持反射。
  • WPF 使用事件(信号/槽系统)通知代码隐藏。这在 C++ 中不会那么容易,因为 C++ 没有本机事件系统。 (虽然有 boost::signals 之类的东西可用)
  • WPF 的类都是由托管代码构建的。

您可以从C++/CLI 访问 WPF,但实际上 C++/CLI 与 C# 的共同点比与 C++ 的共同点要多。它的代码运行方式与 C# 完全一样,但它使用 C++ 的语法(对我来说这并没有什么意义……抱怨 C++ 语法的人几乎比该语言中的其他任何东西都多!)。

如果您想使用 WPF,我建议您只使用 C#。

【讨论】:

  • C++ 可以与任何东西交互,只要它知道如何做到这一点。它是一种低级语言,可编译到各种硬件和软件平台,包括 .NET CLI。
  • C# 反射可以用 RTTI 和普通的旧 OOP 代替(可能有限制)。事件在 C++ 中很好,因为它再次归结为交换消息/调用回调。这就是 Windows 自 1.0 以来的工作方式(毕竟它是用“C with classes”编写的)。当然,它可能没有 C# 事件的所有特殊语法糖,但它可以正常工作。同样,托管代码对于 C++ 来说不是问题。 C++/CLI 提供了一切必要的东西。
  • 另一方面,C++/CLI 可能需要特殊的 API 来访问 WPF 的某些功能,但它可能仍然缺少这些功能。但这是 .NET/WPF API 的问题,而不是 C++。
  • @deemoowoor:XAML 采用类名并在运行时根据其名称创建该类。没有像 C++ 的 RTTI 那样做。而且,不,WPF 与消息或类似的东西完全无关。在这方面它更像 DirectX 而不是 Win32——Windows 子系统根本不管理它。如果您不相信我,请在 Spy++ 中打开一个 WPF 应用程序。
  • @deemoowoor: 哦,你不能将 C++ 编译到 CLR,因为 C++ 具有确定性的对象破坏,你不能在 CLR 上得到它(没有办法明确强制它删除任何东西)。 (除非你在 CLR 之上实现了一个完整的虚拟机之类的东西)
猜你喜欢
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多