CButton&MFC

CButton

按钮窗口(控件)包含了三种样式的按钮,Push Button,Check Box,Radio Box。所以在利用CButton对象生成按钮窗口时需要指明按钮的风格。

创建按钮:BOOL CButton::Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );其中lpszCaption是按钮上显示的文字,dwStyle为按钮风格,除了Windows风格可以使用外(如WS_CHILD|WS_VISUBLE|WS_BORDER)还有按钮专用的一些风格。

BS_AUTOCHECKBOX 检查框,按钮的状态会自动改变 Same as a check box, except that a check mark appears in the check box when the user selects the box; the check mark disappears the next time the user selects the box.

BS_AUTORADIOBUTTON 圆形选择按钮,按钮的状态会自动改变 Same as a radio button, except that when the user selects it, the button automatically highlights itself and removes the selection from any other radio buttons with the same style in the same group.

 BS_AUTO3STATE 允许按钮有三种状态即:选中,未选中,未定 Same as a three-state check box, except that the box changes its state when the user selects it.

BS_CHECKBOX 检查框 Creates a small square that has text displayed to its right (unless this style is combined with the BS_LEFTTEXT style).

BS_DEFPUSHBUTTON 默认普通按钮 Creates a button that has a heavy black border. The user can select this button by pressing the ENTER key. This style enables the user to quickly select the most likely option (the default option).

BS_LEFTTEXT 左对齐文字 When combined with a radio-button or check-box style, the text appears on the left side of the radio button or check box.

BS_OWNERDRAW 自绘按钮 Creates an owner-drawn button. The framework calls the DrawItem member function when a visual aspect of the button has changed. This style must be set when using the CBitmapButton class. 

BS_PUSHBUTTON 普通按钮 Creates a pushbutton that posts a WM_COMMAND message to the owner window when the user selects the button. 

BS_RADIOBUTTON 圆形选择按钮 Creates a small circle that has text displayed to its right (unless this style is combined with the BS_LEFTTEXT style). Radio buttons are usually used in groups of related but mutually exclusive choices. 

BS_3STATE 允许按钮有三种状态即:选中,未选中,未定 Same as a check box, except that the box can be dimmed as well as checked. The dimmed state typically is used to show that a check box has been disabled.

rect为窗口所占据的矩形区域,pParentWnd为父窗口指针,nID为该窗口的ID值。

获取/改变按钮状态:对于检查按钮和圆形按钮可能有两种状态,选中和未选中,如果设置了BS_3STATE或BS_AUTO3STATE风格就可能出现第三种状态:未定,这时按钮显示灰色。通过调用int CButton::GetCheck( ) 得到当前是否被选中,返回0:未选中,1:选中,2:未定。调用void CButton::SetCheck( int nCheck );设置当前选中状态。

处理按钮消息:要处理按钮消息需要在父窗口中进行消息映射,映射宏为ON_BN_CLICKED( id, memberFxn )id为按钮的ID值,就是创建时指定的nID值。处理函数原型为afx_msg void memberFxn( );


重写CButton类

.h

 

class CZPButton : public CButton
{

public:
 CZPButton();
 virtual ~CZPButton();

protected:
 CBitmap m_bmp1;
 CBitmap m_bmp2;
 CBitmap m_bmp3;
 CBitmap m_bmp4;

 //按钮的状态
 BOOL m_bOver;  //鼠标位于按钮之上时该值为true,反之为flase
 BOOL m_bTracking; //在鼠标按下没有释放时该值为true
 BOOL m_bSelected; //按钮被按下是该值为true
 BOOL m_bFocus;  //按钮为当前焦点所在时该值为true

 UINT m_nColor;

public:

 //{{AFX_VIRTUAL(CXPButton)
protected:
 virtual void PreSubclassWindow();
 //}}AFX_VIRTUAL

public:
 ///绘制按钮纹理
 virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
 ///加载按钮各个状态的纹理图
 void CreateBmpFile(LPCSTR str1,LPCSTR str2,LPCSTR str3,LPCSTR str4,UINT nColor);
 void SetEnabled( BOOL bEnabled );


protected:
 //{{AFX_MSG(CXPButton)
 afx_msg void OnMouseMove(UINT nFlags, CPoint point);
 afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
 afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);

 afx_msg BOOL OnEraseBkgnd(CDC* pDC);
 afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
 afx_msg void OnEnable(BOOL bEnable);
 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()
 
};

 

/

.cpp

CZPButton::CZPButton()
{
 m_bOver = m_bSelected = m_bTracking = m_bFocus = FALSE;
 m_nColor=0;
 m_bmp1.Attach(NULL);
 m_bmp2.Attach(NULL);
 m_bmp3.Attach(NULL);
 m_bmp4.Attach(NULL);
}

CZPButton::~CZPButton()
{
 m_bmp1.DeleteObject();
 m_bmp2.DeleteObject();
 m_bmp3.DeleteObject();
 m_bmp4.DeleteObject();
}

///消息映射
BEGIN_MESSAGE_MAP(CXPButton, CButton)
 //{{AFX_MSG_MAP(CXPButton)
 ON_WM_MOUSEMOVE()
 ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
 ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)

 ON_WM_CTLCOLOR()
 ON_WM_ERASEBKGND()
 //}}AFX_MSG_MAP
 ON_WM_ENABLE()
END_MESSAGE_MAP()

void CZPButton::CreateBmpFile(LPCSTR str1,LPCSTR str2,LPCSTR str3,LPCSTR str4,UINT nColor)
{
 m_nColor = nColor;
 if( m_bmp1.m_hObject != NULL )//判断
  m_bmp1.DeleteObject();
 /载入图片1
 HBITMAP hbmp1 = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
  str1, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
 m_bmp1.Attach( hbmp1 );

 if( m_bmp2.m_hObject != NULL )//判断
  m_bmp2.DeleteObject();
 /载入图片2
 HBITMAP hbmp2 = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
  str2, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
 m_bmp2.Attach( hbmp2 );

 if( m_bmp3.m_hObject != NULL )//判断
  m_bmp3.DeleteObject();
 /载入图片3
 HBITMAP hbmp3 = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
  str3, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
 m_bmp3.Attach( hbmp3 );

 if( m_bmp4.m_hObject != NULL )//判断
  m_bmp4.DeleteObject();
 /载入图片4
 HBITMAP hbmp4 = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
  str4, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
 m_bmp4.Attach( hbmp4 );
}

void CZPButton::SetEnabled( BOOL bEnabled )
{
 EnableWindow(bEnabled);
 InvalidateRect(NULL, FALSE);
}
//添加Owner Draw属性
void CZPButton::PreSubclassWindow() 

 ModifyStyle(0, BS_OWNERDRAW);
 CButton::PreSubclassWindow();
}

void CZPButton::OnMouseMove(UINT nFlags, CPoint point) 
{
 if (!m_bTracking)
 {
  TRACKMOUSEEVENT tme;
  tme.cbSize = sizeof(tme);
  tme.hwndTrack = m_hWnd;
  tme.dwFlags = TME_LEAVE | TME_HOVER;
  tme.dwHoverTime = 1;
  m_bTracking = _TrackMouseEvent(&tme);
 }

 CButton::OnMouseMove(nFlags, point);
}


LRESULT CZPButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
 m_bOver = FALSE;
 m_bTracking = FALSE;
 InvalidateRect(NULL, FALSE);
 return 0;
}

LRESULT CZPButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
 m_bOver = TRUE;
 InvalidateRect(NULL);
 return 0;
}


void CZPButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 //从lpDrawItemStruct获取控件的相关信息
 CRect rect =  lpDrawItemStruct->rcItem;
 UINT state = lpDrawItemStruct->itemState;

 //获取按钮的状态
 if (m_bOver)
 {
  CClientDC dc(this);

  CDC memdc;
  memdc.CreateCompatibleDC(&dc);
  CBitmap *pOldImageBMP = memdc.SelectObject(&m_bmp2);
  TransparentBlt(dc.m_hDC, rect.left, rect.top, rect.Width(), rect.Height(), memdc.m_hDC, 0, 0, rect.Width(), rect.Height(), m_nColor);
  memdc.SelectObject(pOldImageBMP);
  memdc.DeleteDC();
  if(pOldImageBMP)
   pOldImageBMP->DeleteObject();
 }
 else
 {
  CClientDC dc(this);

  CDC memdc;
  memdc.CreateCompatibleDC(&dc);
  CBitmap *pOldImageBMP = memdc.SelectObject(&m_bmp1);
  TransparentBlt(dc.m_hDC, rect.left, rect.top, rect.Width(), rect.Height(), memdc.m_hDC, 0, 0, rect.Width(), rect.Height(), m_nColor);
  memdc.SelectObject(pOldImageBMP);
  memdc.DeleteDC();
  if(pOldImageBMP)
   pOldImageBMP->DeleteObject();
 }

 if (state & ODS_SELECTED) 
 {
  CClientDC dc(this);

  CDC memdc;
  memdc.CreateCompatibleDC(&dc);
  CBitmap *pOldImageBMP = memdc.SelectObject(&m_bmp3);
  TransparentBlt(dc.m_hDC, rect.left, rect.top, rect.Width(), rect.Height(), memdc.m_hDC, 0, 0, rect.Width(), rect.Height(), m_nColor);
  memdc.SelectObject(pOldImageBMP);
  memdc.DeleteDC();
  if(pOldImageBMP)
   pOldImageBMP->DeleteObject();
 }
 else if(state & ODS_DISABLED)
 {
  CClientDC dc(this);

  CDC memdc;
  memdc.CreateCompatibleDC(&dc);
  CBitmap *pOldImageBMP = memdc.SelectObject(&m_bmp4);
  TransparentBlt(dc.m_hDC, rect.left, rect.top, rect.Width(), rect.Height(), memdc.m_hDC, 0, 0, rect.Width(), rect.Height(), m_nColor);
  memdc.SelectObject(pOldImageBMP);
  memdc.DeleteDC();
  if(pOldImageBMP)
   pOldImageBMP->DeleteObject();
 }
}


BOOL CZPButton::OnEraseBkgnd(CDC* pDC)
{
 //获取窗口大小
 CRect rt;
 GetClientRect(&rt);
 ///把按钮的背景绘制好
 CDC memdc;
 memdc.CreateCompatibleDC(pDC);
 CBitmap *pOldImageBMP = memdc.SelectObject(&m_bmp4);
 TransparentBlt(pDC->m_hDC, rt.left, rt.top, rt.Width(), rt.Height(), memdc.m_hDC, 0, 0, rt.Width(), rt.Height(), m_nColor);
 memdc.SelectObject(pOldImageBMP);
 memdc.DeleteDC();
 if(pOldImageBMP)
  pOldImageBMP->DeleteObject();

 return TRUE;
}
HBRUSH CZPButton::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 //设置透明背景模式
 pDC->SetBkMode( TRANSPARENT );
 //设置背景刷子为空
 return FALSE;
}
void CZPButton::OnEnable(BOOL bEnable)
{
 CButton::OnEnable(bEnable);

 // TODO: 在此处添加消息处理程序代码
}

 


转载:http://blog.csdn.net/zhengkangchen/article/details/3935970


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值