如何改变CCheckBox的背景色

时间:2022-11-18 14:47:43
我的一个Dialog背景是一副白色的图片

我想把其中的一个CheckBox的背景色改成白色的

我试着从CButton派生一个新的CMyCheckBox,然后 SetBkColor(...)

却发现,那个小方框也变成白色的了,

请问有什么好的方法,只让文字那一部分背景是白色的


11 个解决方案

#1


该回复被版主删除

#2


重载窗口的 OnCtlColor 函数, 其中添加下面的 code:
switch (nCtlColor)
{
  case CTLCOLOR_STATIC:
   // 如果想设置字的颜色, 则可用 pDC->SetTextColor(. ..);
    pDC->SetBkColor(RGB(255, 255, 255));
  break;
  default:
   break;
}

#3



你可以设置背景颜色后,再对控件进行响应,把控件设置成以前的默认颜色.具体看一下下面的代码,看能不能有用

有两种方法。其一,可以在父类中指定控件的颜色,或者利用MFC新的消息反射在控件类中指定颜色。 当控件需要重新着色时,工作框调用父窗口(通常是对话框)的CWnd: : OnCrtlColor,可以在父窗口类中重置该函数并指定控件的新的绘画属性。例如,下述代码将对话中的所有编辑控件文本颜色改为红色:
HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor)

{
 HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor )

 //Draw red text for all edit controls .
 if (nCtlColor= = CTLCOLOR_EDIT )
 pDC —> SetTextColor (RGB (255, 0 , 0 , ) )

 return hbr
}

然而,由于每个父窗口必须处理通知消息并指定每个控件的绘画属性,所以,这种方法不是完全的面向对象的方法。控件处理该消息并指定绘画属性更合情合理。消息反射允许用户这样做。通知消息首先发送给父窗口,如果父窗口没有处理则发送给控件。创建一个定制彩色列表框控件必须遵循下述步骤。

首先,使用ClassWizard 创建一个CListBox 的派生类并为该类添加下述数据成员。
class CMyListBox publilc CListBox
{

private
 COLORREF m_clrFor // foreground color
 COLORREF m_clrBack //background color
 Cbrush m_brush //background brush

}
其次,在类的构造函数中,初始化数据中。
CMyListBox : : CMyListBox ()
{
 //Initialize data members .
 m_clrFore =RGB (255 , 255 , 0) //yellow text
 m_clrBack=RGB (0 , 0 , 255) // blue background
 m_brush . CreateSolidBrush (m _clrBack )
}

最后,使用ClassWizard处理反射的WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新的绘画属性。
HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor )
{
 pDC—>SetTextColor (m_clrFore)
 pDC—>SetBkColor (m_clrBack)

 return (HBRUSH) m_brush.GetSafeHandle ()
}
现在,控件可以自己决定如何绘画,与父窗口无关。

#4


控件的颜色,我知道怎么改变,问题是:
dialog是白色的,checkbox也是白色的,这样就导致,checkbox的那个小方框看不见了;(

我不太清楚楼上的两位是否是这个意思,我在网吧没有vc测试
等回公司,再测试一下。

多谢了:)

#5


就是说把CheckBox的背景色设为你窗口的背景色(这里就是与你的CHECKBOX所在图片的位置的颜色一致,或者pDC->SetBkMode(TRANSPARENT)设置为透明),然后设置CHECKBOX上文字的颜色就行

#6


恩,我回去test一下 thx:)

#7


楼上说的, 我都测试过了, 和我以前的做法是一样的

pDC->SetBkMode(TRANSPARENT), 的确可以把背景改透明了,

问题是, CheckBox右边的小框框 也透明了, 除非用鼠标去点击它, 它才会出现

否则就是透明的 :(

#8


up

#9


弄个Caption为空字符串的Check Box,再在旁边放个Static。Static的颜色啊什么都好对付多了,就是全部自绘也没什么大不了的。

#10


楼上好办法,学习

#11


to Snow_ice

空字符串的CHeckBox, 会有很小的一点空白, 我之前就测试过

我现在还没有找到办法, 我已经打算把 CheckBox 用 Button来代替了, 右边的那个小框框用图片
来代替..

呵呵

#1


该回复被版主删除

#2


重载窗口的 OnCtlColor 函数, 其中添加下面的 code:
switch (nCtlColor)
{
  case CTLCOLOR_STATIC:
   // 如果想设置字的颜色, 则可用 pDC->SetTextColor(. ..);
    pDC->SetBkColor(RGB(255, 255, 255));
  break;
  default:
   break;
}

#3



你可以设置背景颜色后,再对控件进行响应,把控件设置成以前的默认颜色.具体看一下下面的代码,看能不能有用

有两种方法。其一,可以在父类中指定控件的颜色,或者利用MFC新的消息反射在控件类中指定颜色。 当控件需要重新着色时,工作框调用父窗口(通常是对话框)的CWnd: : OnCrtlColor,可以在父窗口类中重置该函数并指定控件的新的绘画属性。例如,下述代码将对话中的所有编辑控件文本颜色改为红色:
HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor)

{
 HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor )

 //Draw red text for all edit controls .
 if (nCtlColor= = CTLCOLOR_EDIT )
 pDC —> SetTextColor (RGB (255, 0 , 0 , ) )

 return hbr
}

然而,由于每个父窗口必须处理通知消息并指定每个控件的绘画属性,所以,这种方法不是完全的面向对象的方法。控件处理该消息并指定绘画属性更合情合理。消息反射允许用户这样做。通知消息首先发送给父窗口,如果父窗口没有处理则发送给控件。创建一个定制彩色列表框控件必须遵循下述步骤。

首先,使用ClassWizard 创建一个CListBox 的派生类并为该类添加下述数据成员。
class CMyListBox publilc CListBox
{

private
 COLORREF m_clrFor // foreground color
 COLORREF m_clrBack //background color
 Cbrush m_brush //background brush

}
其次,在类的构造函数中,初始化数据中。
CMyListBox : : CMyListBox ()
{
 //Initialize data members .
 m_clrFore =RGB (255 , 255 , 0) //yellow text
 m_clrBack=RGB (0 , 0 , 255) // blue background
 m_brush . CreateSolidBrush (m _clrBack )
}

最后,使用ClassWizard处理反射的WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新的绘画属性。
HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor )
{
 pDC—>SetTextColor (m_clrFore)
 pDC—>SetBkColor (m_clrBack)

 return (HBRUSH) m_brush.GetSafeHandle ()
}
现在,控件可以自己决定如何绘画,与父窗口无关。

#4


控件的颜色,我知道怎么改变,问题是:
dialog是白色的,checkbox也是白色的,这样就导致,checkbox的那个小方框看不见了;(

我不太清楚楼上的两位是否是这个意思,我在网吧没有vc测试
等回公司,再测试一下。

多谢了:)

#5


就是说把CheckBox的背景色设为你窗口的背景色(这里就是与你的CHECKBOX所在图片的位置的颜色一致,或者pDC->SetBkMode(TRANSPARENT)设置为透明),然后设置CHECKBOX上文字的颜色就行

#6


恩,我回去test一下 thx:)

#7


楼上说的, 我都测试过了, 和我以前的做法是一样的

pDC->SetBkMode(TRANSPARENT), 的确可以把背景改透明了,

问题是, CheckBox右边的小框框 也透明了, 除非用鼠标去点击它, 它才会出现

否则就是透明的 :(

#8


up

#9


弄个Caption为空字符串的Check Box,再在旁边放个Static。Static的颜色啊什么都好对付多了,就是全部自绘也没什么大不了的。

#10


楼上好办法,学习

#11


to Snow_ice

空字符串的CHeckBox, 会有很小的一点空白, 我之前就测试过

我现在还没有找到办法, 我已经打算把 CheckBox 用 Button来代替了, 右边的那个小框框用图片
来代替..

呵呵