www.pudn.com > VQ_Final.rar > MyButton.cpp
#include "afxwin.h"
#include "MyButton.h"
CMyButton::CMyButton()
{
m_bHover=FALSE;
}
CMyButton::~CMyButton()
{
}
BEGIN_MESSAGE_MAP(CMyButton, CButton)
ON_WM_MOUSEMOVE()
ON_WM_ERASEBKGND()
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)
END_MESSAGE_MAP()
void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
//鼠标捕捉,以得到鼠标离开和停在按钮上的消息
TRACKMOUSEEVENT tme;
tme.cbSize=sizeof(tme);
tme.dwFlags=TME_LEAVE|TME_HOVER;
tme.dwHoverTime=1;
tme.hwndTrack=m_hWnd;
_TrackMouseEvent(&tme);
CButton::OnMouseMove(nFlags, point);
}
//鼠标离开
void CMyButton::OnMouseLeave(WPARAM w,LPARAM l)
{
m_bHover=FALSE;
Invalidate();
}
//鼠标停留
void CMyButton::OnMouseHover(WPARAM w,LPARAM l)
{
m_bHover=TRUE;
Invalidate();
}
void CMyButton::PreSubclassWindow()
{
ModifyStyle(0,BS_OWNERDRAW); //修改按钮的风格使之自绘
CButton::PreSubclassWindow();
}
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpdis)
{
//按不同状态,绘制按钮,写起来得好累呀
CDC *pDC=CDC::FromHandle(lpdis->hDC);
int nState=lpdis->itemState;
CPen pNull,pWhite,pBlack,*penOld;
pNull.CreateStockObject(NULL_PEN);
pWhite.CreatePen(PS_SOLID,3,GetSysColor(COLOR_3DHILIGHT));
pBlack.CreatePen(PS_SOLID,3,GetSysColor(COLOR_BTNSHADOW));
CBrush br,*brOld;
br.CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
lpdis->rcItem.right+=1;
lpdis->rcItem.bottom+=1;
penOld=pDC->SelectObject(&pNull);
brOld=pDC->SelectObject(&br);
pDC->Rectangle(&lpdis->rcItem);
pDC->SelectObject(brOld);
pDC->SelectObject(penOld);
lpdis->rcItem.right-=2;
lpdis->rcItem.bottom-=2;
if (nState & ODS_SELECTED)
{
penOld=pDC->SelectObject(&pBlack);
pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.top);
pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.top);
pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.top);
pDC->LineTo(lpdis->rcItem.left,lpdis->rcItem.bottom);
pDC->SelectObject(&pWhite);
pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.bottom);
pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.bottom);
pDC->MoveTo(lpdis->rcItem.right,lpdis->rcItem.top);
pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.bottom);
pDC->SelectObject(penOld);
lpdis->rcItem.left+=1;
lpdis->rcItem.top+=1;
lpdis->rcItem.right+=1;
lpdis->rcItem.bottom+=1;
}
else
{
if (m_bHover && !(nState & ODS_DISABLED))
{
penOld=pDC->SelectObject(&pWhite);
pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.top);
pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.top);
pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.top);
pDC->LineTo(lpdis->rcItem.left,lpdis->rcItem.bottom);
pDC->SelectObject(&pBlack);
pDC->MoveTo(lpdis->rcItem.left,lpdis->rcItem.bottom);
pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.bottom);
pDC->MoveTo(lpdis->rcItem.right,lpdis->rcItem.top);
pDC->LineTo(lpdis->rcItem.right,lpdis->rcItem.bottom);
pDC->SelectObject(penOld);
}
}
pDC->SetBkMode(TRANSPARENT);
CString str;
GetWindowText(str);
lpdis->rcItem.left-=1;
lpdis->rcItem.top-=1;
lpdis->rcItem.right-=1;
lpdis->rcItem.bottom-=1;
pDC->SetTextColor(RGB(255,255,255));
pDC->DrawText(str,&lpdis->rcItem,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
lpdis->rcItem.left+=1;
lpdis->rcItem.top+=1;
lpdis->rcItem.right+=1;
lpdis->rcItem.bottom+=1;
pDC->SetTextColor((nState & ODS_DISABLED) ? GetSysColor(COLOR_GRAYTEXT) : GetSysColor(COLOR_BTNTEXT));
pDC->DrawText(str,&lpdis->rcItem,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
}
BOOL CMyButton::OnEraseBkgnd(CDC* pDC)
{
return TRUE;//禁止窗口自己重画背景
}