Возможная утечка GDI при перерисовке CButton's - PullRequest
1 голос
/ 28 марта 2012

У меня проблема при изменении размера CControlBar, который содержит несколько кнопок CB.После некоторого изменения размера весь дисплей ломается и перестает правильно рисовать.Основываясь на том, что я могу найти об этих типах проблем, я думаю, что я пропускаю объекты GDI, когда кнопки перерисовываются.

Ниже приведен мой метод DrawItem.Я постоянно нахожу различные способы использования в Интернете, но проблема все еще возникает.

Пожалуйста, кто-нибудь может помочь мне точно определить, что мне нужно изменить и как.

void CNJABarFolderButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  {    

    UINT uState=DFCS_BUTTONPUSH;
    if( lpDrawItemStruct->itemState & ODS_SELECTED )
    {
        uState|=DFCS_PUSHED;
    }

    CDC dc;

    dc.Attach(lpDrawItemStruct->hDC);
    dc.DrawFrameControl(&lpDrawItemStruct->rcItem,DFC_BUTTON,uState);
    if( !IsWindowEnabled() )
    {
        dc.SetTextColor(::GetSysColor(COLOR_3DSHADOW));     
    }

    CString csText;
    GetWindowText(csText);

    if (m_iDisplayType != 2 || !m_hIcon)
    {
        CFont font;
        LOGFONT lf;
        memset(&lf, 0, sizeof(LOGFONT)); 
        lf.lfHeight = m_iFontSize;                      
        strcpy(lf.lfFaceName, "Tahoma Bold");       
        VERIFY(font.CreateFontIndirect(&lf));  

        CFont* def_font = dc.SelectObject(&font);

        RECT buttonRect = lpDrawItemStruct->rcItem;
        buttonRect.left += 10;
        buttonRect.right += 10;

        if (m_iDisplayType != 1 || !m_hIcon) //text & Icon
        {
            buttonRect.left += 30;
            buttonRect.right += 30;
        }   
        dc.DrawText(csText,&buttonRect,DT_LEFT|DT_SINGLELINE|DT_VCENTER);   

        dc.SelectObject(def_font);

        font.DeleteObject();
    }

    if (m_hIcon && m_iDisplayType != 1)
    {   
        CSize czText = dc.GetTextExtent(csText);
        dc.DrawIcon(0,0,m_hIcon);
    }
    dc.Detach();
}
...