关于网友提出的“ 关于OnCtlColor的一段代码,感觉有问题不知道怎么改”问题疑问,本网通过在网上对“ 关于OnCtlColor的一段代码,感觉有问题不知道怎么改”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 关于OnCtlColor的一段代码,感觉有问题不知道怎么改
描述:
//使IDC_STATIC_NAME的字体为指定字体
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//sets the background color to transparent
pDC->SetBkMode(TRANSPARENT);
//sets the background brush to NULL
hbr = (HBRUSH)GetStockObject(NULL_BRUSH);
if (pWnd->GetDlgCtrlID() == IDC_STATIC_NAME )
{
CFont fontOut;
LOGFONT lfOut;
memset(&lfOut, 0, sizeof(LOGFONT));
lfOut.lfHeight = 15;
strcpy(lfOut.lfFaceName, "Arial");
fontOut.CreateFontIndirect(&lfOut);
CFont* pOldFont = pDC->SelectObject(&fontOut);
pDC->SetTextColor( COLOR_TEXT_GRAY );
fontOut.DeleteObject();
}
return hbr;
}
fontOut是CreateFontIndirect的,需要DeleteObject();
但是DeleteObject()前应该先pDC->SelectObject(pOldFont );在OnCtlColor中做这一步又无法使文字字体改变
想把fontOut跟pOldFont 作为全局变量,但是在哪里调用SelectObject?DCD怎么来?
解决方案1: 将fontOut作为CMyDialog类的成员变量,将
LOGFONT lfOut;
memset(&lfOut, 0, sizeof(LOGFONT));
lfOut.lfHeight = 15;
strcpy(lfOut.lfFaceName, "Arial");
fontOut.CreateFontIndirect(&lfOut);
放在对话框的初始化函数中
if (pWnd->GetDlgCtrlID() == IDC_STATIC_NAME )
{
CFont* pOldFont = pDC->SelectObject(&fontOut);
pDC->SetTextColor( COLOR_TEXT_GRAY );
}
在对话框退出时删除fontOut
解决方案2: 字体不要在OnCtlColor里面做.用CWnd::SetFont来做.在WM_CREATE里面设置.字体定义为类成员变量.析构或WM_DESTROY时销毁字体.
以上介绍了“ 关于OnCtlColor的一段代码,感觉有问题不知道怎么改”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2391267.html