gpt4 book ai didi

c# - OpenGL 不在我的 C# 面板上显示/绘制

转载 作者:行者123 更新时间:2023-11-30 04:38:00 37 4
gpt4 key购买 nike

我正在用 C# 编写一个调用 C++ dll 的基本程序。我将面板的句柄提供给 dll,以便 OpenGL 知道在哪里绘制。

    [DllImport(@"../../../Debug/Model.DLL")]
public static extern void startOpenGL(IntPtr hWindow);

我将 IntPtr hWindow 混合为 HWND hWindow。

在我从 C# 调用 draw 之后

    [DllImport(@"../../../Debug/Model.DLL")]
public static extern void draw();

在 C++ 中,我有一个可以调用我的 OpenGLManager 方法的类接口(interface)(对其进行了测试)。

#pragma once
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "singleton.h"
class OpenGLManager
{

public:
static OpenGLManager* instance()
{
if ( p_theInstance == 0 )
p_theInstance = new OpenGLManager;
return p_theInstance;
}
void init(HWND hWnd);
void purge();
void reset();
void showSomething();
private:
HWND mhWnd;
HDC mhDC;
HGLRC mhRC;
static OpenGLManager* p_theInstance;
OpenGLManager(void);
~OpenGLManager(void);
};

.cpp

#include "OpenGLManager.h"
#include <stdio.h>
OpenGLManager* OpenGLManager::p_theInstance = 0;

OpenGLManager::OpenGLManager(void)
{
reset();
}

OpenGLManager::~OpenGLManager(void)
{
purge();
}


void OpenGLManager::showSomething()
{
//MessageBox(NULL,"DRAW","DRAW", MB_OK);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_TRIANGLES);
glVertex3f(-1.0f, -0.5f, -4.0f); // lower left vertex
glVertex3f( 1.0f, -0.5f, -4.0f); // lower right vertex
glVertex3f( 0.0f, 0.5f, -4.0f); // upper vertex
glEnd();
glFlush();

}

void OpenGLManager::init(HWND hWnd)
{


// remember the window handle (HWND)
OpenGLManager::mhWnd = hWnd;

// get the device context (DC)
OpenGLManager::mhDC = GetDC( OpenGLManager::mhWnd );

// set the pixel format for the DC
PIXELFORMATDESCRIPTOR pfd;
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
int format = ChoosePixelFormat( OpenGLManager::mhDC, &pfd );
SetPixelFormat( OpenGLManager::mhDC, format, &pfd );

// create the render context (RC)
OpenGLManager::mhRC = wglCreateContext( OpenGLManager::mhDC );

// make it the current render context
wglMakeCurrent( OpenGLManager::mhDC, OpenGLManager::mhRC );

}

void OpenGLManager::purge()
{
if ( OpenGLManager::mhRC )
{
wglMakeCurrent( NULL, NULL );
wglDeleteContext( OpenGLManager::mhRC );
}
if ( OpenGLManager::mhWnd && OpenGLManager::mhDC )
{
ReleaseDC( OpenGLManager::mhWnd, OpenGLManager::mhDC );
}
reset();
}



void OpenGLManager::reset()
{
OpenGLManager::mhWnd = NULL;
OpenGLManager::mhDC = NULL;
OpenGLManager::mhRC = NULL;
}

我看到 ShowSomething 方法经常被 messageBoxes 调用,但我在 C# 面板上看不到任何东西。 (抱歉出现奇怪的缩进!)

最佳答案

这并不是您问题的真正答案,但您是否考虑过使用 Tao Framework ?它们提供与 OpenGL、SDL 和其他库的易于使用的绑定(bind)。我知道它工作正常并且非常接近 C++ OpenGL 函数,因此您可能希望使用它而不是重新发明轮子。

关于c# - OpenGL 不在我的 C# 面板上显示/绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3435852/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com