【问题标题】:OpenGL don't show/draw on my C# pannelOpenGL 不在我的 C# 面板上显示/绘制
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 我同意。使用 Tao 框架让您的生活变得更加轻松。对于 C#/WPF,您可能希望看到 codeproject.com/KB/WPF/WPFOpenGL.aspx 了解基于 Tao 和非基于 Tao 的解决方案。
    【解决方案2】:

    看起来您在调用 glFlush() 后忘记交换缓冲区。使用下面的函数调用。

    [DllImport("GDI32")]
    public static extern void SwapBuffers(IntPtr dc);
    

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多