MFC CtreeCtrl CustomDraw CDIS\u热更改字体样式失败

MFC CtreeCtrl CustomDraw CDIS\u热更改字体样式失败,mfc,underline,custom-draw,Mfc,Underline,Custom Draw,在自定义绘制MFC CTreeCtrl中,我想在项目处于热状态时删除字体文本下划线,因此代码如下所示: void CTreeCtrlCS::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult) { ........................... ........................... CFont *pCurFont = NULL;

在自定义绘制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");
            ..................
}
启用调试版本时,应用程序崩溃,控制台显示

我没有使用多线程,这很奇怪。 想要的表演是

斯捷帕 步骤B ... 末端牵引

斯捷帕 步骤B 末端牵引

但情况很可能是CDIS_热点案件再次进入。。。 我不明白为什么会这样

顺便说一下, 当项目处于热状态(CDIS\U hot)时,删除行下文本的正确方法是什么?

谢谢你的帮助

    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 {
        ;
    }

现在。现在没事了…

返回指向当前在设备上下文中选择的同一字体对象的指针。它由框架所有。您不负责处理它,而且最肯定的是,当它被选择到设备上下文中时。thks,您只需指出关键错误,我使用了一个CFont来存储从currentfont更改的“新”字体。现在一切正常。。。。。thks….
newfont
超出范围时会被销毁。如果这是您所有的代码,您正在销毁一个仍被选入设备上下文的对象。是的,这只是我代码的一部分,oldfont将被选回dc。。。thks