绘制按钮,组合框,列表框,或者菜单的父窗口按钮时,组合框,列表框,或者菜单的可视方面已经改变
// 按钮的style有BS_OWNERDRAW
/
MFC代码
ButtonDrawItem.h
#ifndef BUTTONDRAWITEM_HEAD
#define BUTTONDRAWITEM_HEAD
class CButtonColor:public CButton
{
public:
//构造函数
CButtonColor();
//析构函数
virtual ~CButtonColor();
//重载函数
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};
#endif
xxx.cpp
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
//在主窗口中重载基类的函数,在.h头文件中
HBRUSH CMfcTest1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
switch (pWnd->GetDlgCtrlID())
{
case IDC_BUTTON1: //按钮
{
//pDC->SetTextColor(RGB(255,0,0)); //设置文字颜色红色
pDC->SetBkColor(RGB(0,0,255)); //设置背景颜色绿色
}
break;
case IDC_CHECK1: //CHK按钮
{
pDC->SetTextColor(RGB(255,0,0)); //设置文字颜色红色
pDC->SetBkColor(RGB(0,0,255)); //设置背景颜色绿色
}
break;
case IDC_EDIT1: //编辑框
{
pDC->SetTextColor(RGB(255,0,0)); //设置文字颜色红色
pDC->SetBkColor(RGB(0,0,255)); //设置背景颜色绿色
}
break;
case IDC_RADIO1: //单选
{
pDC->SetTextColor(RGB(255,0,0)); //设置文字颜色红色
pDC->SetBkColor(RGB(0,0,255)); //设置背景颜色绿色
}
break;
case IDC_STATIC1: //静态标签
{
pDC->SetTextColor(RGB(255,0,0)); //设置文字颜色红色
//pDC->SetBkMode(TRANSPARENT); //设置透明背景
pDC->SetBkColor(RGB(0,0,255)); //设置背景颜色绿色
pDC->SelectObject(&m_font); //设置字体
}
break;
case IDC_STATIC_Group: //组框标签
{
pDC->SetTextColor(RGB(255,0,0));//ASCII有效
//pDC->SetBkMode(TRANSPARENT); //设置透明背景
//pDC->SetBkColor(RGB(0,0,255)); //设置背景颜色绿色
//pDC->SelectObject(&m_font); //设置字体
}
break;
default:
break;
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
//return m_brush;
return hbr;
}
///
在win32 SDK中
在窗口过程中加入如下消息
case WM_DRAWITEM:HANDLE_WM_DRAWITEM(hwndDlg,wParam,lParam,m_EventMessage.OnCtlDrawItem); break;
case WM_CTLCOLORSTATIC:
return HANDLE_WM_CTLCOLORSTATIC(hwndDlg,wParam,lParam,m_EventMessage.OnCtlColorStatic);
case WM_CTLCOLOREDIT:
return HANDLE_WM_CTLCOLOREDIT(hwndDlg,wParam,lParam,m_EventMessage.OnCtlColorEdit);
case WM_CTLCOLORDLG:
return HANDLE_WM_CTLCOLORDLG(hwndDlg,wParam,lParam,m_EventMessage.OnCtlColorDlg);
case WM_CTLCOLORBTN:
return HANDLE_WM_CTLCOLORBTN(hwndDlg,wParam,lParam,m_EventMessage.OnCtlColorBtn);
下面是函数的声明部分和实现部分
//静态控件颜色方案
HBRUSH OnCtlColorStatic(HWND hwndDlg,HDC hdc,HWND hwndChild, LPARAM once);
//编辑框控件颜色方案
HBRUSH OnCtlColorEdit(HWND hwndDlg,HDC hdc,HWND hwndChild, LPARAM once);
//对话框控件颜色方案
HBRUSH OnCtlColorDlg(HWND hwndDlg,HDC hdc,HWND hwndChild, LPARAM once);
//按钮控件颜色方案
HBRUSH OnCtlColorBtn(HWND hwndDlg,HDC hdc,HWND hwndChild, LPARAM once);
//绘制按钮,组合框,列表框,或者菜单的父窗口按钮时,组合框,列表框,或者菜单的可视方面已经改变
void OnCtlDrawItem(HWND hwndDlg,const DRAWITEMSTRUCT * lpDrawItemStruct);
//静态控件颜色方案
HBRUSH CEventMessage::OnCtlColorStatic(HWND hwndDlg,HDC hdc,HWND hwndChild, LPARAM once)
{
//静态标签
if (hwndChild==GetDlgItem(win.hwnd,IDC_STATIC1))
{
SetTextColor(hdc, RGB(255,0,0)); //设置文字颜色
SelectObject(hdc,win.hfont); //设置文字字体
//SetBkColor(hdc, RGB(0,0,255)); //设置背景颜色
//return GetSysColorBrush(COLOR_BTNFACE);
}
//组框
if (hwndChild==GetDlgItem(win.hwnd,IDC_STATIC2))
{
SetTextColor(hdc, RGB(0,255,0));
//SetBkColor(hdc, RGB(0,0,255)); //设置背景颜色
//return GetSysColorBrush(COLOR_BTNFACE);
}
//单选
if (hwndChild==GetDlgItem(win.hwnd,IDC_RADIO1))
{
SetTextColor(hdc, RGB(0,0,255));
//SetBkColor(hdc, RGB(0,0,255)); //设置背景颜色
//return GetSysColorBrush(COLOR_BTNFACE);
}
//CHK按钮
if (hwndChild==GetDlgItem(win.hwnd,IDC_CHECK1))
{
SetTextColor(hdc, RGB(255,255,0));
//SetBkColor(hdc, RGB(0,0,255)); //设置背景颜色
//return GetSysColorBrush(COLOR_BTNFACE);
}
//SetTextColor(hdc, RGB(255,0,0));
//SetBkColor(hdc,RGB(0,0,255)); //设置背景颜色绿色
SetBkColor(hdc,GetSysColor(COLOR_BTNFACE)); //设置背景色为系统背景色
SetWindowLong(hwndDlg, DWL_MSGRESULT, (LONG)TRUE);
return GetSysColorBrush(COLOR_BTNFACE);
}
//编辑框控件颜色方案
HBRUSH CEventMessage::OnCtlColorEdit( HWND hwndDlg,HDC hdc,HWND hwndChild, LPARAM once )
{
if (hwndChild==GetDlgItem(win.hwnd,IDC_EDIT1))
{
SetTextColor(hdc,RGB(255,0,0));
SetBkColor(hdc,RGB(255,255,255));
}
return GetSysColorBrush(COLOR_BTNFACE);
}
//对话框控件颜色方案
HBRUSH CEventMessage::OnCtlColorDlg( HWND hwndDlg,HDC hdc,HWND hwndChild, LPARAM once )
{
return GetSysColorBrush(COLOR_BTNFACE);
return m_DlgBrush;
}
//绘制按钮,组合框,列表框,或者菜单的父窗口按钮时,组合框,列表框,或者菜单的可视方面已经改变
void CEventMessage::OnCtlDrawItem(HWND hwndDlg,const DRAWITEMSTRUCT * lpDrawItemStruct)
{
if (lpDrawItemStruct->hwndItem==GetDlgItem(hwndDlg,IDC_BUTTON1))
{
UINT uStyle = DFCS_BUTTONPUSH;
RECT rect=lpDrawItemStruct->rcItem;
assert(lpDrawItemStruct->CtlType == ODT_BUTTON);
// If drawing selected, add the pushed style to DrawFrameControl.
if (lpDrawItemStruct->itemState & ODS_SELECTED)
uStyle |= DFCS_PUSHED;
::DrawFrameControl(lpDrawItemStruct->hDC, &rect,
DFC_BUTTON, uStyle);
// Get the button's text.
TCHAR strText[64]={0};
GetWindowText(GetDlgItem(win.hwnd,IDC_BUTTON1),strText,ARRAYSIZE(strText));
// Draw the button text using the text color red.
COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));
::DrawText(lpDrawItemStruct->hDC, strText, _tcslen(strText),
&rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
}
return;
}
//按钮控件颜色方案
HBRUSH CEventMessage::OnCtlColorBtn( HWND hwndDlg,HDC hdc,HWND hwndChild, LPARAM once )
{
//按钮
if (hwndChild==GetDlgItem(win.hwnd,IDC_BUTTON1))
{
SetBkColor(hdc,RGB(0,0,255)); //设置背景颜色绿色
}
return GetSysColorBrush(COLOR_BTNFACE);
}
//
win32 sdk 另外一种实现方案(只是消息的形式改变了)
case WM_CTLCOLORSTATIC:
{
if((HWND)lParam == m_hwnd[4]) //编辑框1的
{
SetTextColor((HDC)wParam, RGB(255,0,0));
}
else //其他编辑框的
{
SetTextColor((HDC)wParam, GetSysColor(COLOR_WINDOWTEXT));
}
SetBkColor((HDC)wParam, GetSysColor(COLOR_BTNFACE));
SetWindowLong(hwndDlg, DWL_MSGRESULT, (LONG)TRUE);
return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
}
break;