当前位置:C++技术网 > 资讯 > 对话框添加Group-box控件后,如何隐藏Group-box Control边框或者改变颜色

对话框添加Group-box控件后,如何隐藏Group-box Control边框或者改变颜色

更新时间:2017-04-24 22:32:03浏览次数:1+次

在MFC里面添加Group-box控件后,在为对话框添加备注图片时,发现无法隐藏Group-box控件边框或者改变Group-box控件边框颜色,请问如何进行修改?

C++技术网会员解答:

    您好,感谢您对C++技术网的支持与信任。

    Group-Box控件和静态标签、图片控件等都是同一类控件,都对应于MFC的CStatic控件类。默认的ID都是IDC_STATIC,并且都默认关闭通知消息。如下图所示:

CStatic Notify关闭

   这个通知属性Notify关闭的话,对话框有消息也不通知控件,也就无法对控件进行消息转发,控件就不能实现修改文字背景和颜色之类的。因为对话框上的消息是最先由父窗口处理,再转发给控件。Notify关闭父窗口就不转发消息给控件,这样的控件就叫做静态控件,通常用于提示、背景显示。如果你想改变颜色,你就要启用这个属性。

    然而标准控件很多样式都是固化了,我们只能做简单的修改。而本提问的隐藏Group-box控件边框或者改变Group-box控件边框颜色就无法实现。我们可以修改背景颜色等。

    如果要进行修改,可以行的办法就是重载控件,自绘控件。我们自己干预标准控件的每一步的绘制过程,这样来定制自己的样式。自绘方法参考:控件自绘技术介绍

    当然,Group-Box就完全没有必要自绘了。静态标签本来就是固定不变的,而且都是很简单的实现。我们可以直接手动将线条文字等绘制在界面上。当背景变化时,为了和背景适配,我们可以随意调整我们的线条颜色等。这样的方法不限制于控件的固定模式。

    通过OnCtlColor消息处理,可以达到这样的效果:

   实现代码供参考:

HBRUSH Ctmp2Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    static CBrush brh(RGB(255,0,0));//静态画刷资源
    if (nCtlColor==CTLCOLOR_STATIC)
    {
        if(pWnd->GetDlgCtrlID()==IDC_STATIC1)
        {
            CRect rect;
            GetDlgItem(IDC_STATIC1)->GetClientRect(rect);//获取groupbox矩形大小
            rect.InflateRect(-20,-20,-20,-20);
            pDC->FillRect(rect,&brh);//填充Groupbox矩形背景色
            pDC->FrameRect(&rect,&CBrush(RGB(0,0,255)));//直接绘制矩形边框
            pDC->SetTextColor(RGB(0,0,255));//设置打印文字颜色
            pDC->SetBkColor(RGB(0,255,255));//设置打印文字背景色
            //pDC->SetBkMode(TRANSPARENT);//把字体的背景变成透明的
            pDC->DrawText(_T("hello C++技术网\r\nwww.cjjjs.com"),&rect,DT_EXPANDTABS);
            return (HBRUSH)brh.m_hObject;//返回Groupbox背景画刷绘制画刷
        }
    }
    return hbr;
}
    可以看到,这样简单的处理是没法实现需要的效果的。其实这个控件也就几个线条,我们可以参考代码中绘制线条的方式实现。或者参考前面给出的参考文章,试着用重载自绘CStatic控件类来实现。给一个大方向,请自行实现吧。