Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;混合(本地管理)和#x2B;sdl&x2B;opengl&;c#winforms 我正在使用C++中的OpenGL编写交互式渲染软件。 随着项目的发展,我希望有一个HIM/GUI来操作我的渲染引擎_C#_C++_Winforms_Opengl_Sdl - Fatal编程技术网

C++;混合(本地管理)和#x2B;sdl&x2B;opengl&;c#winforms 我正在使用C++中的OpenGL编写交互式渲染软件。 随着项目的发展,我希望有一个HIM/GUI来操作我的渲染引擎

C++;混合(本地管理)和#x2B;sdl&x2B;opengl&;c#winforms 我正在使用C++中的OpenGL编写交互式渲染软件。 随着项目的发展,我希望有一个HIM/GUI来操作我的渲染引擎,c#,c++,winforms,opengl,sdl,C#,C++,Winforms,Opengl,Sdl,因此,我开始寻找一些简单/快速的编码方法。 最后,我决定使用winforms和c来创建HIM,因为它提供了一种设计和编写HIM的简单方法 首先,我开始创建一个具有本地和托管C++的混合DLL。好啊 在我尝试在c#应用程序中使用此dll之后。嗯 现在我的目标是:在winforms应用程序中插入opengl渲染 我的问题是: 我可以将我的SDLcontext/SDLwindows(C++)绑定到winforms对象吗 我可以将c#位图绑定到dll中的字节数组吗?(目的是通过dll更新其像素) 如

因此,我开始寻找一些简单/快速的编码方法。 最后,我决定使用winforms和c来创建HIM,因为它提供了一种设计和编写HIM的简单方法

首先,我开始创建一个具有本地和托管C++的混合DLL。好啊 在我尝试在c#应用程序中使用此dll之后。嗯

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

我的问题是:

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

多亏了劳伦斯·科克,我才得以继续我的研究

因此,我尝试将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)


鉴于您的目标平台是Windows,有一种非常简单的方法可以将opengl渲染插入到Windows窗体应用程序中。您只需使用您喜欢的软件包sdl、sfml和普通winapi代码创建一个窗口。当您获得相关窗口的句柄时,只需更改窗口的样式,使其成为子窗口,并将其作为所选窗口的子窗口。对于父窗口,我喜欢做的是为此目的创建一个子类special panel type控件


之后,您可以像正常情况一样使用控件的组成。只有空域问题可能会影响表示()。

我不知道SDL,但您肯定可以获得WinForms对象的句柄,因此您应该能够在SDL中使用句柄值。至于位图,是的,你可以操纵像素,关于这个主题这里有几个问题。
// 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;
}
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);
}