C++ 不同框架的OpenGL

C++ 不同框架的OpenGL,c++,qt,opengl,C++,Qt,Opengl,我们有两个项目。其中之一是PyQt应用程序。另一个项目是delphi应用程序。两个项目必须使用opengl绘制相同的内容。因此,我们不能使用QOpenGLWidgets(我们的delphi项目中没有qt) 但我们希望在dll中使用低级opengl API,并将QWidget的HWND传输到opengl。我们是新手。我们不能:'( 我们找到了一个使用窗口的HWND创建opengl上下文和绘图的窗口。下一步我们创建QWidget,获取其HWND(WinID)。但是函数WinProc和WinMain停

我们有两个项目。其中之一是PyQt应用程序。另一个项目是delphi应用程序。两个项目必须使用opengl绘制相同的内容。因此,我们不能使用QOpenGLWidgets(我们的delphi项目中没有qt)

但我们希望在dll中使用低级opengl API,并将QWidget的HWND传输到opengl。我们是新手。我们不能:'(

我们找到了一个使用窗口的HWND创建opengl上下文和绘图的窗口。下一步我们创建QWidget,获取其HWND(WinID)。但是函数WinProc和WinMain停止处理消息

然后,我们尝试在qwidget构造函数中创建opengl上下文,并在qwidget.PaintEvent中调用函数display,但我们可以在调整窗口大小时看到图片(在标准函数以白色填充窗口之后,我们看不到图片)

#包括
#包括
#包括
#包括
#包括
#包括
无效的
显示()
{
/*旋转一个三角形*/
glClear(GLU颜色缓冲位);
glBegin(GL_三角形);
GL3F(1.0f,0.0f,0.0f);
glVertex2i(0,1);
GL3F(0.0f,1.0f,0.0f);
glVertex2i(-1,-1);
GL3F(0.0f、0.0f、1.0f);
glVertex2i(1,-1);
格伦德();
glFlush();
}
无效初始化EGL(HWND HWND){
int-pf;
HDC HDC;/*设备上下文*/
像素描述符pfd;
hDC=GetDC(hWnd);
memset(&pfd,0,sizeof(pfd));
pfd.nSize=sizeof(pfd);
pfd.inversion=1;
pfd.dwFlags=pfd_DRAW_TO_WINDOW | pfd_SUPPORT_OPENGL;
pfd.iPixelType=pfd_TYPE_RGBA;
pfd.cColorBits=32;
pf=选择像素格式(hDC和pfd);
SetPixelFormat(hDC、pf和pfd);
描述像素格式(hDC、pf、sizeof(像素格式描述符)和pfd);
释放DC(hWnd、hDC);
}
无效油漆GL(HWND HWND){
HDC HDC;/*设备上下文*/
HGLRC hRC;/*opengl上下文*/
hDC=GetDC(hWnd);
hRC=wglCreateContext(hDC);
wglMakeCurrent(hDC,hRC);
静态PAINTSTRUCT-ps;
开始油漆(hWnd和ps);
显示();
端漆(hWnd和ps);
wglMakeCurrent(NULL,NULL);
释放DC(hWnd、hDC);
背景(hRC);
}
类MyGlWidget:publicqwidget{
公众:
MyGlWidget(){
初始化egl((HWND)this->winId());
}
无效paintEvent(QPaintEvent*事件){
//MyGlWidget::paintEvent(事件);
paintGL((HWND)this->winId());
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
myglw;
w、 show();
//w、 设置样式表(“背景:红色”);
返回a.exec();
}
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>
#include <qapplication.h>
#include <qwidget.h>

void
display()
{
    /* rotate a triangle around */
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex2i(0, 1);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex2i(-1, -1);
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex2i(1, -1);
    glEnd();
    glFlush();
}

void initializeGL(HWND hWnd) {
    int pf;
    HDC hDC;                            /* device context */
    PIXELFORMATDESCRIPTOR pfd;

    hDC = GetDC(hWnd);

    memset(&pfd, 0, sizeof(pfd));
    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 32;

    pf = ChoosePixelFormat(hDC, &pfd);
    SetPixelFormat(hDC, pf, &pfd);
    DescribePixelFormat(hDC, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);

    ReleaseDC(hWnd, hDC);
}

void paintGL(HWND hWnd) {
    HDC hDC;                            /* device context */
    HGLRC hRC;                          /* opengl context */

    hDC = GetDC(hWnd);
    hRC = wglCreateContext(hDC);
    wglMakeCurrent(hDC, hRC);

    static PAINTSTRUCT ps;
    BeginPaint(hWnd, &ps);
    display();
    EndPaint(hWnd, &ps);

    wglMakeCurrent(NULL, NULL);
    ReleaseDC(hWnd, hDC);
    wglDeleteContext(hRC);
}

class MyGlWidget : public QWidget {

public:
    MyGlWidget() {
        initializeGL((HWND)this->winId());
    }

    void paintEvent(QPaintEvent * event) {
        //MyGlWidget::paintEvent(event);
        paintGL((HWND)this->winId());
    }

};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyGlWidget w;
    w.show();
    //w.setStyleSheet("background:red");

    return a.exec();
}