rc与多个dc

OpenGL 绘图的机制是:先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的绘图上下文 Device Context (简记为 DC)。在程序运行过程中,可以有多个 DC,但只能有一个 RC,因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。
按照这个思路,


需要设置一个全局的HGLRC,例如可以在主框架OnCreate函数里
    // Opengl的渲染描述表
    SetMyPixelFormat(::GetDC(m_hWnd));
    HGLRC h = wglCreateContext(::GetDC(m_hWnd));
    theOpenglRC.SetGlrc(h);

需要在窗口的OnPaint函数中加入一句代码:
    wglMakeCurrent(dc.GetSafeHdc(), theOpenglRC.GetGlrc());
    Paint();
    SwapBuffers(dc.GetSafeHdc());


void CStudyOpenglWnd::Paint()
{
    // 设置视口左下高度宽度
    RECT rect = {0};
    GetClientRect(&rect);
    GLdouble glHeight = rect.bottom - rect.top;
    GLdouble glWidth = rect.right - rect.left;
    glViewport(0, 0, glWidth, glHeight);

    // 求纵横比
    m_glAspect = 1;
    m_glOrthoX = 1000;
    if(0 != glWidth)
        m_glAspect = (GLdouble)glHeight / (GLdouble)glWidth;

    // 设置为投影矩阵,并设置其左下右上。
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-m_glOrthoX, m_glOrthoX, 
        -m_glOrthoX * m_glAspect, m_glOrthoX * m_glAspect, 
        -m_glOrthoX, m_glOrthoX);

    // 清除
    glClearColor(1.f, 1.f, 1.f, 0.0f) ;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(0.0f, 0.0f, 0.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // 旋转角度
    GLdouble gldRotateAngle = 270 * 3.1415926 / 180;
    // 份数
    GLint glnCount = 24;

    GLdouble gldMin = m_glOrthoX < m_glOrthoX * m_glAspect ? m_glOrthoX : m_glOrthoX * m_glAspect;

    // 外圆
    GLdouble gldRadiusOuter = gldMin / 1.25;
    glBegin(GL_LINES);
    for (int i=0; i<glnCount; i++)
    {
        GLdouble gldAngle = i * gldRotateAngle / glnCount;
        GLdouble gldx = gldRadiusOuter * cos(gldAngle);
        GLdouble gldy = gldRadiusOuter * sin(gldAngle);
        GLdouble gldAngleNext = (i + 1) * gldRotateAngle / glnCount;
        GLdouble gldxNext = gldRadiusOuter * cos(gldAngleNext);
        GLdouble gldyNext = gldRadiusOuter * sin(gldAngleNext);
        glVertex2d(gldx, gldy);
        glVertex2d(gldxNext, gldyNext);
    }
    glEnd();

    // 内圆
    GLdouble gldRadiusInner = gldRadiusOuter / 2;
    glBegin(GL_LINES);
    for (int i=0; i<glnCount; i++)
    {
        GLdouble gldAngle = i * gldRotateAngle / glnCount;
        GLdouble gldx = gldRadiusInner * cos(gldAngle);
        GLdouble gldy = gldRadiusInner * sin(gldAngle);
        GLdouble gldAngleNext = (i + 1) * gldRotateAngle / glnCount;
        GLdouble gldxNext = gldRadiusInner * cos(gldAngleNext);
        GLdouble gldyNext = gldRadiusInner * sin(gldAngleNext);
        glVertex2d(gldx, gldy);
        glVertex2d(gldxNext, gldyNext);
    }
    glEnd();

    // 内外径
    glBegin(GL_LINES);
    for (int i=0; i<glnCount+1; i++)
    {
        GLdouble gldAngle = i * gldRotateAngle / glnCount;
        GLdouble gldxInner = gldRadiusInner * cos(gldAngle);
        GLdouble gldyInner = gldRadiusInner * sin(gldAngle);
        GLdouble gldxOuter = gldRadiusOuter * cos(gldAngle);
        GLdouble gldyOuter = gldRadiusOuter * sin(gldAngle);
        glVertex2f(gldxInner, gldyInner);
        glVertex2f(gldxOuter, gldyOuter);
    }
    glEnd();

    glBegin(GL_LINES);
    glVertex2f(0, 0);
    glVertex2f(1, 1);
    glEnd();

    glFinish();
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值