GDI ... 或 C++ 的等价物?

GDI... or equivalent for C++?

我自己都弄糊涂了,所以我认为这里是提出这个问题的好地方。

如果我想用 C++ 编写自己的自定义控件(也完全自定义绘制),除了 GDI/GDI+,我还有哪些替代方案?

我已经在 VB 和 C# 中使用 GDI 做了一段时间,但我想从 C++ 开始。

我不想使用任何第三方的东西,而是坚持使用原生的。我将制作的应用程序类型我猜你会说像 WinForms apps/GUI-based.

但我不想用 C++ 创建 WinForms 应用程序。

我应该使用 Direct2D 在 C++ 中进行 UI 绘图吗?或者 C++ 有 GDI 吗?我应该使用什么?

我将创建的控件类型是:

TextBox、ListView、Switch Control、Progress Indicator...基本上,我将从头开始用 C++ 重写我在 C# 中制作的所有控件。

看看 Irrlicht:http://irrlicht.sourceforge.net/

它在技术上是一个游戏引擎,但我已经在许多项目中使用它来进行简单的 2D UI 绘图。学习曲线也非常平缓。

无论如何,它具有您要询问的所有控件,但如果您愿意,还可以编写自己的控件。

A while ago I was told that GDI is a C# thing

嗯,不,GDI 早于 .NET,并且是 c/c++ 和兼容语言的默认选择。它至少可以追溯到 Windows 3 天(更早的时间我没有经验,所以我无法发表评论)。

The Microsoft Windows graphics device interface (GDI) enables applications to use graphics and formatted text on both the video display and the printer. Windows-based applications do not access the graphics hardware directly. Instead, GDI interacts with device drivers on behalf of applications - More...

GDI+ 是 "class-based API for C/C++ programmers":

Windows GDI+ is a class-based API for C/C++ programmers. It enables applications to use graphics and formatted text on both the video display and the printer. Applications based on the Microsoft Win32 API do not access graphics hardware directly. Instead, GDI+ interacts with device drivers on behalf of applications. GDI+ is also supported by Microsoft Win64. More...

OP:

I want to write my own Custom Controls (fully-custom drawn too) in C++?

好问题。由于您想在 C++ 中创建它们并执行完全自定义绘制,因此您有几个选择。

Subclassing

这是一项非常古老的技术,我不确定是否有人再费心了。这是我们在 OLE/ActiveX 控件出现之前所做的事情。这个想法是让一个控件已经存在并且在运行时你 subclass 这样你就可以有效地接管控件的外观和感觉。缺点是容器完成了大部分工作,而且它们并不是真正可重用的。

ActiveX 控件

原来是OLE COM控件; ActiveX 大约在 1995 年左右出现,当时 Internet 正在起飞,需要使 OLE 控件更小以便更快地加载网页。它们本质上是 OLE 控件,但删除了网页不需要的许多不需要的 COM 接口。

ActiveX控件,为COM;与 subclassing 不同,它是语言中立的并且真正可重用。您可以将 ActiveX 嵌入到支持 COM 的容器中,无论它们是 C++; Delphi;视觉对象; VB;使用权;网络甚至 .NET WinForms。

自定义绘制

ActiveX 的真正好处是您可以创建复合控件(包含其他标准 Windows 控件的控件)或空白完全可呈现的控件,您可以在其中使用 GDI/GDI+ (或任何可以渲染到 GDI 上下文的东西)让你创造一个真正美丽的;自定义控件。

见过那些漂亮的图表吗?他们很可能是 ActiveX。

查看 Microsoft ATL c++ class 库。它有一些用于创建 COM ActiveX 控件和容器的重要框架。 WTL 也是一个很好的通用库,如果内存可用,MS 将其发布到 public 域。

Direct2D

Should I use Direct2D for UI drawing in C++? Or does C++ have GDI? What should I use?

除非您对硬件加速有特殊需求,否则使用 Direct2D 会让您走上一条您可能不想要的路径 - 例如在支持 Direct2D 的计算机上,在您的应用程序中设置 Direct2D 环境。但是,如果您有兴趣 here is a nice article on D2D-GDI interop

我会坚持 GDI/GDI+。