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); }

 

posted @ 2020-03-30 17:27  坦坦荡荡  阅读(958)  评论(0编辑  收藏  举报