CButton控件
分三类:
由CButton类封装,继承自CWnd类
三种按钮均由CButton创建,只需要指定样式:
BS_PUSHBUTTON,
BS_CHECKBOX,
BS_RADIOBUTTON
成员函数:
virtual BOOL Create(LPCTSTR lpszCaption, //按钮标题 DWORD dwStyle, //样式 const RECT& rect, //按钮位置 CWnd* pParentWnd, //父窗口 UINT nID //按钮ID
);
按钮风格:
如何为按钮设置图标?
法一:将CButton样式指定为BS_BITMAP,为按钮设置位图(设置位图)
法二:使用CBitmapButton(位图按钮)
MFC提供CBitmapButton用于创建用位图而不是文本做标签的按钮控件。CBitmapButton对象最多可以包含四个位图,分别代表按钮的四种不同状态:
未按下(或正常),按下(或选中),获得焦点和被禁止存取。只有第一个位图是必须的,其他三个可以不提供。
class CBitmapButton:public CButton
按钮上色:
1.Owner Draw属性设置为true
2.利用类向导给对话框(不是按钮)添加WM_DRAWITEM消息响应函数OnDrawltem
3.添加代码,重绘按钮
void CMy25Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nIDCtl == IDC_BUTTON1)
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
TCHAR buffer[MAX_PATH];
ZeroMemory(buffer, MAX_PATH);
::GetWindowText(lpDrawItemStruct->hwndItem, buffer, MAX_PATH);
//绘制按钮的背景
dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(0, 255, 0));
dc.Draw3dRect(&lpDrawItemStruct->rcItem, RGB(255, 0, 0), RGB(255, 255, 0));
//设置文字背景透明
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(0, 0, 0));
//绘制按钮标题
dc.DrawText(buffer, &lpDrawItemStruct->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
//用完dc分离
dc.Detach();
}
CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
Button点击效果和变色:重写CButton类的虚函数Drawltem来绘制
1.利用类向导创建Cbutton的派生类CMyBtn
2.在类视图中使用类向导,添加PreSubclassWindow与Drawltem两个虚函数
3.重写
void CMyBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 添加您的代码以绘制指定项
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rc = lpDrawItemStruct->rcItem;
//绘制按钮的边框
UINT state = lpDrawItemStruct->itemState;
if (state&ODS_SELECTED)
{
pDC->DrawFrameControl(rc,DFC_BUTTON,DFCS_BUTTONPUSH|DFCS_PUSHED);
}
else
{
pDC->DrawFrameControl(rc, DFC_BUTTON, DFCS_BUTTONPUSH );
}
rc.DeflateRect(CSize(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)));
pDC->FillSolidRect(rc, RGB(255, 0, 0));
int mode = pDC->SetBkMode(TRANSPARENT);
CString text;
GetWindowText(text);
pDC->DrawText(text, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
void CMyBtn::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
//设置按钮为自绘BS_OWNERDRAW, 防止第三方使用类时忘记设置按钮为BS_OWNERDRAW
ModifyStyle(0,BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
4.添加鼠标消息:
设置成员变量COLORREF m_color,用于切换按钮背景颜色
COLORREF m_color;
void CMyBtn::OnMouseHover(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_color = RGB(255, 255, 0);
Invalidate();
CButton::OnMouseHover(nFlags, point);
}
void CMyBtn::OnMouseLeave()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_color = RGB(255, 0, 0);
Invalidate();
CButton::OnMouseLeave();
}
void CMyBtn::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
TRACKMOUSEEVENT csTME;
csTME.cbSize = sizeof(csTME);
csTME.dwFlags = TME_LEAVE | TME_HOVER;
csTME.hwndTrack = m_hWnd; //指定要追踪的窗口
csTME.dwHoverTime = 2; //鼠标停留超过2ms,认定为状态HOVER
::_TrackMouseEvent(&csTME);
CButton::OnMouseMove(nFlags, point);
}