在自定义绘制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");
..................
}
在 调试版 时,应用程序崩溃,控制台显示
我没有使用多线程,这非常奇怪。 期望的节目是
步骤A 步骤B ... 结束抽奖
步骤A 步骤B 结束抽奖
但情况很可能是CDIS_HOT案件重新进入...... 我不明白为什么会发生这种情况?
顺便说一下, 当项目处于热门状态(CDIS_HOT)时,删除行下文本的正确方法是什么?任何帮助表示感谢。
答案 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 {
;
}
现在。现在好了......