【问题标题】:How can I call C++ OpenGL code inside a C# winform window?如何在 C# winform 窗口中调用 C++ OpenGL 代码?
【发布时间】:2014-09-18 16:29:47
【问题描述】:

我需要编写一个窗口窗口,上面有一个工具条,中间有一个 OpenGL 窗口,底部有一个状态行:

我对在 win32 中编写 GUI 元素并不感到兴奋。我有一些用 C# 编写 winforms 的经验,我想这样做。

那么问题是如何实现 OpenGL 窗口? 据我了解,OpenTK 带有一个 GLControl .net 组件,我可以将其添加到表单中。

但是,我已经有了要在 C++ 中使用的 OpenGL 代码。 我宁愿不必将它移植到 OpenTK,而是直接使用它。

我怎样才能做到这一点?

我还应该解释一下我的窗口不是主窗口。它在另一个我正在为其实现插件的程序中运行。

【问题讨论】:

    标签: c# windows winforms winapi opengl


    【解决方案1】:

    OpenGL 上下文是每个线程的状态。如果您在 C# 中使用 OpenTK 使上下文成为当前上下文,那么您从同一线程调用的任何 C++ 代码都将自动使用它。

    【讨论】:

    • 谢谢本!您是否知道使用这种方法时 OpenGL 的任何限制/部分不起作用?我猜 GLControl 所做的是封装下面 GIGuru 描述的创建 OpenGL 上下文,因此它应该与它不同,即不以任何方式限制 OpenGL?
    • @Andy:是的,没错。唯一真正的限制与您的 OpenTK 版本中的上下文创建有关——如果您的 C++ 代码期望使用 OpenGL 3+ 上下文,那么 OpenTK 需要先创建一个 2.x 上下文然后覆盖一个3+ 上下文。相反,如果您的 C++ 代码使用 OpenGL 3.0 之前的例程,您不希望 OpenTK 创建前向上下文。
    【解决方案2】:

    这是你需要做的:

    1. 将您的 C++ 代码隔离到一个 dll 中。
    2. 创建 C# 应用程序并创建 OpenGL 上下文。使其成为当前上下文。
    3. 使用 pinvoke 通过 C# 代码调用 C++ 代码的本机函数。您可以公开一个或多个可由 C# 应用程序调用的入口点。

    我从未亲自尝试过,但理论上这应该可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-22
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多