如何在 ActiveX 控件中正确初始化 OpenGL

How to properly initialize OpenGL in ActiveX controls?

本文关键字:初始化 OpenGL 控件 ActiveX      更新时间:2023-10-16

我正在尝试使用OpenGL创建一个简单的ActiveX控件。我在PreCreateWindow中添加了一些样式:

BOOL CMFCActiveXControl1Ctrl::PreCreateWindow(CREATESTRUCT& cs) {
    cs.style |=  WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
    cs.lpszClass = _T("STATIC");
    return COleControl::PreCreateWindow(cs);
}

OpenGL 的初始化:

int CMFCActiveXControl1Ctrl::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    PIXELFORMATDESCRIPTOR pfd = { 0 };
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;
    hDC = ::GetDC(m_hWnd);
    int format = ChoosePixelFormat(hDC, &pfd);
    SetPixelFormat(hDC, format, &pfd);
    hRC = wglCreateContext(hDC);
    wglMakeCurrent(hDC, hRC);
    return 0;
}

然后我尝试用红色清除颜色缓冲区,但我看到的只是一个黑色方块:

void CMFCActiveXControl1Ctrl::OnDraw(
        CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
    if (!pdc)
       return;
    glClearColor(1, 0, 0, 0);
    SwapBuffers(wglGetCurrentDC());
}

glClearColor (...)实际上并没有清除颜色缓冲区,它只是设置调用glClear (...)时将使用的颜色。

GL3 中有一个新功能:glClearBuffer (...)可用于在一次调用中将缓冲区清除为显式值,但通常您需要在设置清除颜色后调用glClear (GL_COLOR_BUFFER_BIT)