关于函数OnCtlColor()改变btn按钮控件的文字颜色和背景颜色的问题 20
HBRUSHCLogin::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CDialogEx::OnCtlC...
HBRUSH CLogin::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
if(nCtlColor==CTLCOLOR_STATIC)
{
pDC->SetTextColor(RGB(255,255,0));
pDC->SetBkColor(RGB(0,0,255));
}
// 这里,改变static控件的文字颜色和背景颜色,运行效果正确。
if(nCtlColor==CTLCOLOR_BTN)
{
pDC->SetTextColor(RGB(255,0,0));
}
//这里,为什么改成CTLCOLOR_BTN后,运行后button按钮控件的文字颜色不会改变呢????????
if(pWnd==this)
{
return m_brush;
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
} 展开
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
if(nCtlColor==CTLCOLOR_STATIC)
{
pDC->SetTextColor(RGB(255,255,0));
pDC->SetBkColor(RGB(0,0,255));
}
// 这里,改变static控件的文字颜色和背景颜色,运行效果正确。
if(nCtlColor==CTLCOLOR_BTN)
{
pDC->SetTextColor(RGB(255,0,0));
}
//这里,为什么改成CTLCOLOR_BTN后,运行后button按钮控件的文字颜色不会改变呢????????
if(pWnd==this)
{
return m_brush;
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
} 展开
1个回答
展开全部
您好,
//CColorBtn.h
class CColorBtn : public CButton
{
DECLARE_DYNAMIC(CColorBtn)
public:
CColorBtn();
virtual ~CColorBtn();
void SetHighLightTextColor(COLORREF color);//设置高亮时字体的颜色
void SetHighLightBkColor(COLORREF color);//设置高亮时的背景颜色
COLORREF GetHighLightTextColor() const;//获取高亮时字体的颜色
COLORREF GetHighLightBkColor() const;//设置高亮时的背景颜色
protected:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);//重载,颜色的修改工作主要通过此函数来完
bool m_IsHighLight;//记录按钮是否处于高亮状态的标志
UINT m_uStyle;//记录按钮类型的变量
COLORREF m_HighLightTextColor;//文本高亮颜色值
COLORREF m_HighLightBkColor;//背景高亮颜色值
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClicked();
protected:
virtual void PreSubclassWindow();
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
};
以下是对应的CPP文件,主要列举一些关键函数:
1.构造函数:
[cpp] view plaincopy
CColorBtn::CColorBtn()
{
m_IsHighLight=false;//默认按钮没有处于高亮状态
m_uStyle=DFCS_BUTTONPUSH;//窗口的默认样式
m_HighLightTextColor=RGB(255,0,0);//默认高亮字体为红色
m_HighLightBkColor=RGB(0,255,0);//默认高亮背景色为绿色
}
2.鼠标按键按下响应函数:
[cpp] view plaincopy
void CColorBtn::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_uStyle|=DFCS_PUSHED;
CButton::OnLButtonDown(nFlags, point);
}
上述中,对于按钮的样式一定要用m_uStyle|=DFCS_PUSHED; 这样才能在保证按钮风格的情况下产生按下的效果。
3.鼠标按键弹起响应函数:
[cpp] view plaincopy
void CColorBtn::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_uStyle=DFCS_BUTTONPUSH;
CButton::OnLButtonUp(nFlags, point);
}
上述代码中,再将按钮样式回复为没有按下的状态即可:
4.修改按钮的OwnerDraw属性。由于在调用这个类时,不能保证用户会在界面上将按钮的OwnerDraw属性置为True,因此,这里通过代码来进行修改,主要通过重载PreSubclassWindow()函数来实现:
[cpp] view plaincopy
void CColorBtn::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
this->ModifyStyle(NULL,BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
5.自绘函数:
[cpp] view plaincopy
void CColorBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 添加您的代码以绘制指定项
//依据窗口类型绘制控件
::DrawFrameControl(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,DFC_BUTTON,m_uStyle);
CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
//获取按钮的文本信息
CString strText;
GetWindowText(strText);
LONG dist=0;//缩进距离
CBrush brush;
CRect rect;
CRect focusRect;
if(m_IsHighLight)
{
brush.CreateSolidBrush(m_HighLightBkColor);
}
else
{
brush.CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));
}
rect.CopyRect(&lpDrawItemStruct->rcItem);
dist=2;
rect.left+=dist;
rect.right-=dist;
rect.top+=dist;
rect.bottom-=dist;
::FillRect(lpDrawItemStruct->hDC,&rect,(HBRUSH)brush.m_hObject);
::SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);
COLORREF crOldColor;
if(m_IsHighLight)
{
crOldColor=::SetTextColor(lpDrawItemStruct->hDC,m_HighLightTextColor);
}
else
{
crOldColor=::SetTextColor(lpDrawItemStruct->hDC,RGB(0,0,0));
}
::DrawText(lpDrawItemStruct->hDC,strText,strText.GetLength(),&lpDrawItemStruct->rcItem,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC,crOldColor);
if(::GetFocus()==this->m_hWnd)
{
focusRect.CopyRect(&lpDrawItemStruct->rcItem);
dist=3;//缩进距离
focusRect.left+=dist;
focusRect.right-=dist;
focusRect.top+=dist;
focusRect.bottom-=dist;
::DrawFocusRect(lpDrawItemStruct->hDC,(LPRECT)&focusRect);
}
}
//CColorBtn.h
class CColorBtn : public CButton
{
DECLARE_DYNAMIC(CColorBtn)
public:
CColorBtn();
virtual ~CColorBtn();
void SetHighLightTextColor(COLORREF color);//设置高亮时字体的颜色
void SetHighLightBkColor(COLORREF color);//设置高亮时的背景颜色
COLORREF GetHighLightTextColor() const;//获取高亮时字体的颜色
COLORREF GetHighLightBkColor() const;//设置高亮时的背景颜色
protected:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);//重载,颜色的修改工作主要通过此函数来完
bool m_IsHighLight;//记录按钮是否处于高亮状态的标志
UINT m_uStyle;//记录按钮类型的变量
COLORREF m_HighLightTextColor;//文本高亮颜色值
COLORREF m_HighLightBkColor;//背景高亮颜色值
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClicked();
protected:
virtual void PreSubclassWindow();
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
};
以下是对应的CPP文件,主要列举一些关键函数:
1.构造函数:
[cpp] view plaincopy
CColorBtn::CColorBtn()
{
m_IsHighLight=false;//默认按钮没有处于高亮状态
m_uStyle=DFCS_BUTTONPUSH;//窗口的默认样式
m_HighLightTextColor=RGB(255,0,0);//默认高亮字体为红色
m_HighLightBkColor=RGB(0,255,0);//默认高亮背景色为绿色
}
2.鼠标按键按下响应函数:
[cpp] view plaincopy
void CColorBtn::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_uStyle|=DFCS_PUSHED;
CButton::OnLButtonDown(nFlags, point);
}
上述中,对于按钮的样式一定要用m_uStyle|=DFCS_PUSHED; 这样才能在保证按钮风格的情况下产生按下的效果。
3.鼠标按键弹起响应函数:
[cpp] view plaincopy
void CColorBtn::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_uStyle=DFCS_BUTTONPUSH;
CButton::OnLButtonUp(nFlags, point);
}
上述代码中,再将按钮样式回复为没有按下的状态即可:
4.修改按钮的OwnerDraw属性。由于在调用这个类时,不能保证用户会在界面上将按钮的OwnerDraw属性置为True,因此,这里通过代码来进行修改,主要通过重载PreSubclassWindow()函数来实现:
[cpp] view plaincopy
void CColorBtn::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
this->ModifyStyle(NULL,BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
5.自绘函数:
[cpp] view plaincopy
void CColorBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 添加您的代码以绘制指定项
//依据窗口类型绘制控件
::DrawFrameControl(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,DFC_BUTTON,m_uStyle);
CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
//获取按钮的文本信息
CString strText;
GetWindowText(strText);
LONG dist=0;//缩进距离
CBrush brush;
CRect rect;
CRect focusRect;
if(m_IsHighLight)
{
brush.CreateSolidBrush(m_HighLightBkColor);
}
else
{
brush.CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));
}
rect.CopyRect(&lpDrawItemStruct->rcItem);
dist=2;
rect.left+=dist;
rect.right-=dist;
rect.top+=dist;
rect.bottom-=dist;
::FillRect(lpDrawItemStruct->hDC,&rect,(HBRUSH)brush.m_hObject);
::SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);
COLORREF crOldColor;
if(m_IsHighLight)
{
crOldColor=::SetTextColor(lpDrawItemStruct->hDC,m_HighLightTextColor);
}
else
{
crOldColor=::SetTextColor(lpDrawItemStruct->hDC,RGB(0,0,0));
}
::DrawText(lpDrawItemStruct->hDC,strText,strText.GetLength(),&lpDrawItemStruct->rcItem,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC,crOldColor);
if(::GetFocus()==this->m_hWnd)
{
focusRect.CopyRect(&lpDrawItemStruct->rcItem);
dist=3;//缩进距离
focusRect.left+=dist;
focusRect.right-=dist;
focusRect.top+=dist;
focusRect.bottom-=dist;
::DrawFocusRect(lpDrawItemStruct->hDC,(LPRECT)&focusRect);
}
}
追问
你这个搞得太复杂了。我只想知道OnCtlColor()下怎么改,看清我问的是啥。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询