【发布时间】:2010-08-08 19:58:24
【问题描述】:
我正在用 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 的方法。
#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# 面板上什么也没看到。 (对不起,奇怪的缩进!)
【问题讨论】:
标签: c# c++ visual-studio opengl winapi