您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> 关于OnCtlColor的一段代码,感觉有问题不知道怎么改

关于OnCtlColor的一段代码,感觉有问题不知道怎么改

来源:网络整理     时间:2016/7/7 19:30:52     关键词:

关于网友提出的“ 关于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

相关图片

相关文章