MFC CtreeCtrl CustomDraw CDIS_HOT изменить стиль шрифта не удалось

В customdraw MFC CTreeCtrl я хочу удалить подчеркнутый текст шрифта, когда элемент находится в горячем состоянии, поэтому код выглядит так:

void CTreeCtrlCS::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
{
            ...........................
            ........................... 

            CFont       *pCurFont = NULL;
            CFont       *pNewFont = NULL;
            LOGFONT     logfont;

            /* Draw Hot State */
            if (itemState & CDIS_HOT) {
                printf ("step A \n");
                pCurFont = dc.GetCurrentFont ();
                printf ("step B \n");
                memset ((void *) &logfont,0,sizeof (logfont));
                printf ("step C \n");
                pCurFont->GetLogFont (&logfont);
                printf ("step D \n");
                logfont.lfUnderline = 0;  /* remove the underline */
                pCurFont->DeleteObject ();
                printf ("step E \n");
                pCurFont->CreateFontIndirect (&logfont);
                printf ("step F \n");
                dc.SelectObject (pCurFont);
                printf ("step G \n");
            } else {
                ;
            }
            printf ("end draw \n");
            ..................
}

когда на отладочной версии происходит сбой приложения и консоль показывает

Я не использовал многопоточность, это очень и очень странно. Желаемое шоу

StepA stepB ... конец розыгрыша

stepA stepB конец розыгрыша

Но ситуация наиболее вероятна, что дело CDIS_HOT повторно вошло... Я не понимаю, почему это случилось?

Кстати,как правильно удалить текст под строкой, когда элемент находится в горячем состоянии (CDIS_HOT) ?

любая помощь приветствуется.

1 ответ

    CFont       *pCurFont = NULL;
    CFont       *pNewFont = NULL;
    CFont       *pOldFont = NULL;
    LOGFONT     logfont;
    CFont       newfont ;

    /* Draw Hot State */
    if (itemState & CDIS_HOT) {
        pCurFont = dc.GetCurrentFont ();
        if (pCurFont)  {
            memset ((void *) &logfont,0,sizeof (logfont));
            if (pCurFont->GetLogFont (&logfont)) {
                logfont.lfUnderline = 0;
                logfont.lfHeight = pRect->bottom - pRect->top - 3;
                logfont.lfWeight = FW_BOLD;
                newfont.CreateFontIndirect (&logfont);
                pOldFont = dc.SelectObject (&newfont);
            }
        }
    } else {
        ;
    }

Сейчас все нормально...

Другие вопросы по тегам