【问题标题】:C++ hybrid (native managed) +sdl + opengl & c# winformsC++ 混合(本机托管)+sdl + opengl & c# winforms
【发布时间】:2015-04-04 06:13:07
【问题描述】:

我正在开发一个交互式渲染软件,使用 c++ 编写的 sdl 中的 opengl。 项目不断发展,我想要一个 HIM/GUI 来操纵我的渲染引擎。

所以我开始寻找一些简单/快速的 HIM 编码方法来做到这一点。 最后我决定使用 winforms 和 c# 来创建 HIM,因为它提供了一种轻松设计和编码 HIM 的方法。

起初,我开始使用本机和托管 c++ 创建一个混合 dll。好的。 在我尝试在 c# 应用程序中使用这个 dll 之后。好的。

现在我的目标是:在 winforms 应用程序中插入 opengl 渲染。

我的问题是:

  • 我可以将我的 SDLcontext/SDLwindows(C++) 绑定到 winforms 对象吗?
  • 我可以将 c# 位图绑定到我的 dll 中的字节数组吗? (旨在通过 dll 更新它的像素)
    • 如果正常:我是否必须调用函数来在像素更改时刷新我的 GUI(winforms)?
  • 您认为放弃 SDL 并仅使用 winform 进行此类工作会很有趣吗?
  • 有什么建议吗?

编辑:添加有关我的调查的信息

感谢 Lawrence Kok,我继续我的研究。

所以我尝试将我的 SDL 窗口绑定到面板表单

private void LaunchEngine(string str)
{
  unsafe
  {
    byte[] bytes = Encoding.ASCII.GetBytes(str);
    sbyte[] sbyt = (sbyte[])(Array)bytes;
    fixed (sbyte* p = sbyt)
    {
      // Engine is a managed class that bridge my c++ to c#
      // all it's function are static
      Engine.LOAD_CONTENT_FROM_FILE(p);
      Engine.PRINTCONFIGURATION();
      if (Engine.LOAD_ENGINE_DATA() && Engine.INITIALISE_ENGINE_DATA())
      {
        // Bind attempt here           
        _SdlWindowHandle = Engine.GETHANDLE();
        SetWindowPos(_SdlWindowHandle, this.Handle, 0, 0, 0, 0, (SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_SHOWWINDOW));

        // Make the SDL Window the child of our Panel
        SetParent(_SdlWindowHandle, m_SdlPanel.Handle);
        ShowWindow(_SdlWindowHandle, ShowWindowCommand.SW_SHOWNORMAL);

        // In futur i will put this loop in another thread
        // but for now I'm trying to validate my prototype
        for (; ; )
        {
          Engine.UPDATE_ENGINE_DATA();
          Engine.DRAW_ENGINE_DATA();
        }
      }
    }
  }

实际上,更改我的sdl窗口的父级,关闭它,我的引擎正在运行,但我的面板完全空白。

我想我在这里遗漏了一些东西,但我不知道是什么。

这是我如何获得 SDL 窗口句柄(来自 SDL2)

// coming from c++ native library
// and represent by Engine.GETHANDLE();
// from managed c++ lib
HWND SDLWindowManager::GetHandle()
{
  SDL_SysWMinfo info;
  SDL_VERSION(&info.version);

  /*if (SDL_GetWMInfo(&info) < 0)
   return 0;*/

  SDL_GetWindowWMInfo(_mainWindow, &info);
  return info.info.win.window;
}

编辑:问题已解决

我忘记将面板添加到 winforms 控件:

public Form1()
{
  InitializeComponent();

  m_SdlPanel = new Panel();
  m_SdlPanel.Size = new Size(512, 512);
  m_SdlPanel.Location = new Point(0, 0);
  Controls.Add(m_SdlPanel);
}

【问题讨论】:

  • 我不知道 SDL,但是你肯定可以得到一个 WinForms 对象的句柄,所以你应该可以在 SDL 中使用句柄值。至于位图,是的,您可以操纵像素,这里有几个关于这个主题的问题。

标签: c# c++ winforms opengl sdl


【解决方案1】:

鉴于您的目标平台是 Windows,有一种非常简单的方法可以将您的 opengl 渲染插入到您的 Windows 窗体应用程序中。您可以使用您最喜欢的软件包、sdl、sfml、普通的 winapi 代码简单地制作一个窗口。当您获得相关窗口的句柄时,只需将窗口的样式更改为子窗口,并将其作为您选择的窗口的子窗口即可。至于父窗口,我喜欢做的是为此目的子类化特殊面板式控件。

之后,您可以照常使用控件的组合。只有空域问题可能会影响演示文稿 (https://msdn.microsoft.com/en-us/library/aa970688%28v=vs.110%29.aspx)。

【讨论】:

    猜你喜欢
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2011-10-19
    • 2011-12-03
    • 1970-01-01
    • 2016-03-16
    相关资源
    最近更新 更多