自定义按钮类

 

1.       新建一个MFC类,名称为CCustomButton,父类CButton

2.       构造函数中初始化按钮字体

      CCustomButton::CCustomButton()

{

       Font.CreateFont( 12, 0, 0, 0, FW_HEAVY, 0, 0, 0, ANSI_CHARSET, \

              OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, \

              VARIABLE_PITCH | FF_SWISS, "MS Sans Serif" );

}

3.       改写按钮类的DrawItem虚方法

void CCustomButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

{

       // TODO: Add your code to draw the specified item

              if (lpDrawItemStruct->CtlType==ODT_BUTTON )

       {

              CDC *pBtnDC = CDC::FromHandle(lpDrawItemStruct->hDC);       //获取按钮关联的DC

       //获取按钮的绘画区域

       CRect BtnRC = lpDrawItemStruct->rcItem;

       //获取按钮的当前状态

       int BtnState = lpDrawItemStruct->itemState;

      

       //获取按钮文本

       CString BtnText;

       GetWindowText(BtnText);

 

       CBrush           Brush;

       CBrush           *pOldBrush;

       CPoint           PT(2,2);

      

       pBtnDC->SelectObject(&Font);

       pBtnDC->SetTextColor( RGB( 255, 255, 250 ) );

       //如果按钮获得焦点或按钮被选中

       if (BtnState & ODS_SELECTED || BtnState & ODS_FOCUS)

       {

              Brush.CreateSolidBrush( RGB( 160, 160, 160 ) );

              pBtnDC->SetTextColor( RGB( 50, 50, 250 ) );

       }

       else

       {

              CBitmap bmp;

              bmp.LoadBitmap(IDB_BITMAP1);

              Brush.CreatePatternBrush(&bmp);

       }

       pOldBrush = pBtnDC->SelectObject( &Brush );

       pBtnDC->RoundRect(&BtnRC, PT);

 

       pBtnDC->SetBkMode(TRANSPARENT);

       pBtnDC->DrawText(BtnText, &BtnRC, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

       pBtnDC->DeleteDC();  

       Brush.DeleteObject();

       }    

}

4.       设置按钮的Owner Draw属性为True.这时按钮没有回车响应,需要截获回车键按下和抬起的消息响应

BOOL CCustomButton::PreTranslateMessage(MSG* pMsg)

{

       if(pMsg->hwnd==this->GetSafeHwnd()&&pMsg->message==WM_KEYDOWN && pMsg->wParam==13)

       {

              pMsg->lParam=0;

              pMsg->message=WM_LBUTTONDOWN;

       }

       if(pMsg->hwnd==this->GetSafeHwnd()&&pMsg->message==WM_KEYUP && pMsg->wParam==13)

       {

              pMsg->lParam=0;

              pMsg->message=WM_LBUTTONUP;

       }

       return CButton::PreTranslateMessage(pMsg);

}

5.       在需要重绘按钮的对话框中引用自定义类,然后CCustomButton m_BTLogin;

6.            CDialog::DoDataExchange(pDX);

       //{{AFX_DATA_MAP(CLogin)后加入DDX_Control(pDX, IDC_LOGIN, m_BTLogin);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值