MFC CtreeCtrl CustomDraw CDIS_HOT更改字体样式失败

时间:2015-05-17 11:32:20

标签: mfc underline custom-draw

在自定义绘制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");
            ..................
}

调试版 时,应用程序崩溃,控制台显示

enter image description here

我没有使用多线程,这非常奇怪。 期望的节目是

步骤A 步骤B ... 结束抽奖

步骤A 步骤B 结束抽奖

但情况很可能是CDIS_HOT案件重新进入...... 我不明白为什么会发生这种情况?

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

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

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

现在。现在好了......