MFC#利用ON_WM_CTLCOLOR()消息修改控件背景颜色和文字颜色

15 篇文章 4 订阅

如果您觉得本文对您有用,可以收藏一波,方便日后查询;如果您有疑问,可以在文章后面留言,看到后我会尽快回复。

本文以CEdit控件为例来说明“如何修改CEdit的背景色和文字颜色”。

第1步,在“xxx.cpp”中添加消息映射:

BEGIN_MESSAGE_MAP(CUIConfirmVehicle, CBaseView)
    ON_WM_CTLCOLOR()
END_MESSAGE_MAP()

第2步,在头文件中声明消息响应函数,并定义一个CBrush类型的变量;:

afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

...

CBrush m_editBrush;

第3步,在“xxx.cpp”中实现消息响应函数的代码,并在构造函数中或者其它合适的地方创建画刷:

CUIConfirmVehicle::CUIConfirmVehicle()
	: CBaseView(IDD_VIEW_CONFIRMVEHICLE)
{
    m_editBrush.CreateSolidBrush(RGB(255, 255, 255));
}


HBRUSH CUIConfirmVehicle::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CBaseView::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO:  在此更改 DC 的任何特性


    return hbr;
}

上面函数的实现代码是类向导自动生成的,未人为添加。

第4步,修改函数实现,修改之前必须要先了解一下此函数的几个参数的作用:

pDC
指向子窗口的显示上下文的指针。

pWnd
指向要修改颜色的控件的指针。

nCtlColor包含以下值之一,指定控件类型:

  • CTLCOLOR_BTN Button control

  • CTLCOLOR_DLG Dialog box

  • CTLCOLOR_EDIT Edit control

  • CTLCOLOR_LISTBOX List-box control

  • CTLCOLOR_MSGBOX Message box

  • CTLCOLOR_SCROLLBAR Scroll-bar control

  • CTLCOLOR_STATIC Static control

通过第3个参数,我们知道要修改编辑框控件的颜色的话,就可以这样写了:

HBRUSH CUIConfirmVehicle::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CBaseView::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO:  在此更改 DC 的任何特性

    // TODO:  如果默认的不是所需画笔,则返回另一个画笔
    if (CTLCOLOR_EDIT == nCtlColor)
    {                
        return m_editBrush;
    }

    return hbr;
}

同理如果要修改按钮控件的颜色,只需要把

if (CTLCOLOR_EDIT == nCtlColor)

替换成

if (CTLCOLOR_BTN  == nCtlColor)

注意事项

(1)这种方法会改掉某一类型的所有控件的颜色,比如上面的判断如果是“CTLCOLOR_EDIT ”,那么所有的界面上的所有CEdit控件的颜色都会被修改。

(2)必须返回一个CBrush类型的变量,该画刷的颜色就是控件的背景颜色,而且这个变量不能时临时变量,要定义成成员变量或者new出来。

那么如何只修改某一个CEdit控件的颜色,且不影响其它CEdit控件的颜色?

HBRUSH CUIConfirmVehicle::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CBaseView::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO:  在此更改 DC 的任何特性

    if (pWnd->GetDlgCtrlID() == IDC_EDIT_02)
    {
        // 设置文字颜色为红色
        pDC->SetTextColor(RGB(255, 0, 0));

        //设置文字背景为透明的,这样整个编辑框的背景不会被文字的背景覆盖,但是我试了一下,有没有下面这行都没影响。
        pDC->SetBkMode(TRANSPARENT);

        return m_editBrush;
    }

    return hbr;
}

核心代码是:

if (pWnd->GetDlgCtrlID() == IDC_EDIT_02)

上面代码中的即为我们创建的CEdit控件的ID,不管我们是用代码手动创建的控件,还是在资源视图直接拖放到界面上的控件,都会有一个ID,如果不知道怎么查看ID的话,那就需要补充一下基本知识了。

因为每个控件的ID都不一样,所以通过对ID作判断,就可以单独设置某一个控件的颜色了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Roson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值