C++;混合(本地管理)和#x2B;sdl&x2B;opengl&;c#winforms 我正在使用C++中的OpenGL编写交互式渲染软件。 随着项目的发展,我希望有一个HIM/GUI来操作我的渲染引擎
因此,我开始寻找一些简单/快速的编码方法。 最后,我决定使用winforms和c来创建HIM,因为它提供了一种设计和编写HIM的简单方法 首先,我开始创建一个具有本地和托管C++的混合DLL。好啊 在我尝试在c#应用程序中使用此dll之后。嗯 现在我的目标是:在winforms应用程序中插入opengl渲染 我的问题是: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更新其像素) 如
- 我可以将我的SDLcontext/SDLwindows(C++)绑定到winforms对象吗
- 我可以将c#位图绑定到dll中的字节数组吗?(目的是通过dll更新其像素)
- 如果确定:我是否必须调用函数来刷新像素更改时的GUI(winforms)
- 您认为放弃SDL并仅使用winforms进行此类工作会很有趣吗
- 有什么建议吗
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);
}