在其中一个页面里绘图:
void CMyPaint::OnTimer(UINT_PTR nIDEvent)
{
HWND hWnd = this->GetSafeHwnd(); 
HDC hDC = ::GetDC(hWnd);
m_hDC = hDC; wglMakeCurrent(m_hDC,this->m_hGLContext);
DrawGrid();  //OpenGL绘图程序
glColor4f(1.0f,0,0,1.0f);
selectFont(40, ANSI_CHARSET,"Times New Roman");
if(m_hDC != NULL)
{
wglUseFontBitmaps(m_hDC, 0, 128, 256); 
glRasterPos2f(40.0F, 260.0F); 

glListBase(256); 
glCallLists(5,GL_UNSIGNED_BYTE,"hello");
glRasterPos2f(250.0F, 260.0F);  
glCallLists(5,GL_UNSIGNED_BYTE,"hello");
glRasterPos2f(140.0F, 260.0F); 
glCallLists(5,GL_UNSIGNED_BYTE,"hello");
}

Invalidate(FALSE);
wglMakeCurrent(NULL,NULL);
if(m_hDC)
::ReleaseDC(hWnd,m_hDC); CDialog::OnTimer(nIDEvent);
}
其中
void CMyPaint::selectFont(int size, int charset, const char* face)
{
HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
       charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);
if(m_hDC != NULL)
{
HFONT hOldFont = (HFONT)SelectObject(m_hDC, hFont);
DeleteObject(hOldFont);
}
}
如果我调用selectFont函数时,程序运行一段时间后就会出现异常,界面显示不正常,如果不调用selectFont的话,程序就会正常显示。是怎么回事啊?

解决方案 »

  1.   

    CreateFontA与删除的DeleteObject,对应的不是同一个句柄!你不能用selectFont完成这件事!要这样:
    void CMyPaint::OnTimer(UINT_PTR nIDEvent) 

    HWND hWnd = this->GetSafeHwnd(); 
    HDC hDC = ::GetDC(hWnd); 
    m_hDC = hDC; wglMakeCurrent(m_hDC,this->m_hGLContext); 
    DrawGrid();  //OpenGL绘图程序 
    glColor4f(1.0f,0,0,1.0f); 
    /////////////////////////
    HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0, 
          charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, 
            DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face); 
    if(m_hDC != NULL) 

    HFONT hOldFont = (HFONT)SelectObject(m_hDC, hFont); } 
    ////////////////////////
    if(m_hDC != NULL) 

    wglUseFontBitmaps(m_hDC, 0, 128, 256); 
    glRasterPos2f(40.0F, 260.0F); glListBase(256); 
    glCallLists(5,GL_UNSIGNED_BYTE,"hello"); 
    glRasterPos2f(250.0F, 260.0F);  
    glCallLists(5,GL_UNSIGNED_BYTE,"hello"); 
    glRasterPos2f(140.0F, 260.0F); 
    glCallLists(5,GL_UNSIGNED_BYTE,"hello"); 
    } Invalidate(FALSE); 
    wglMakeCurrent(NULL,NULL); 
    /////////////////////
    SelectObject(m_hDC, hOldFont ); 
    DeleteObject(hFont); 
    //////////////////////////if(m_hDC) 
    ::ReleaseDC(hWnd,m_hDC); CDialog::OnTimer(nIDEvent);