MFC CtreeCtrl CustomDraw CDIS\u热更改字体样式失败
在自定义绘制MFC CTreeCtrl中,我想在项目处于热状态时删除字体文本下划线,因此代码如下所示: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;
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