AVE和WM_MOUSEHOVER消息。由于WM_MOUSEMOVE消息是标准的Windows消息,只需要在类向导中添加即可触发,而WM_MOUSELEAVE和WM_MOUSEHOVER两个消息需要通过WM_MOUSEMOVE消息来启动触发。
OnMouseLeave实现定义如下:
//CSkinButton.h定义
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
//CSkinButton.cpp定义消息
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
//CSkinButton.cpp实现
LRESULT CSkinButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
if ( m_bTrackMouseEvent )
{
m_bTrackMouseEvent = FALSE;
Invalidate();
}
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
return 1;
}
OnMouseMove实现如下:
void CSkinButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetWindowRect(rect);
ScreenToClient(rect);
if ( !m_bTrackMouseEvent )
{
m_bTrackMouseEvent = TRUE;
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE;
tme.dwHoverTime = HOVER_DEFAULT;
tme.hwndTrack = m_hWnd;
_TrackMouseEvent(&tme);
Invalidate();
}
::SetCursor(AfxGetApp()->LoadStandardCursor(MAKEINTRESOURCE(32649)));
CButton::OnMouseMove(nFlags, point);
}
5) 图片绘制
装载位图:
HBITMAP hImageBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),strImagePath, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
按九个方向进行图片绘制:
BOOL CSkinButton::Draw9gridTransparent(HDC hSrcDC, CRect rcItem, CRect rcBorder, HBITMAP hBitmap)
{
if (hBitmap)
{
BITMAP bitmap;
::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
int m_nWidth = bitmap.bmWidth;
int m_nHeight = bitmap.bmHeight;
HDC memdc;
memdc = CreateCompatibleDC(hSrcDC);
::SelectObject(memdc, hBitmap);
//左上角
CRect rcLeftTop;
rcLeftTop.left = rcItem.left;
rcLeftTop.top = rcItem.top;
rcLeftTop.right = rcLeftTop.left+m_rcBorder9grid.left;
rcLeftTop.bottom = rcLeftTop.top+m_rcBorder9grid.top;
::TransparentBlt(hSrcDC, rcLeftTop.left, rcLeftTop.top, rcLeftTop.Width(), rcLeftTop.Height(), memdc, 0, 0, m_rcBorder9grid.left, m_rcBorder9grid.top, RGB(255,0,255));
//右上角
CRect rcRightTop;
rcRightTop.left = rcItem.right-m_rcBorder9grid.right;
rcRightTop.right = rcItem.right;
rcRightTop.top = rcItem.top;
rcRightTop.bottom = rcRightTop.top+m_rcBorder9grid.top;
::TransparentBlt(hSrcDC, rcRightTop.left, rcRightTop.top, rcRightTop.Width(), rcRightTop.Height(), memdc, m_nWidth-m_rcBorder9grid.right, 0, m_rcBorder9grid.right, m_rcBorder9grid.top, RGB(255,0,255));
//右下角
CRect rcRightBottom;
rcRightBottom.left = rcItem.right-m_rcBorder9grid.right;
rcRightBottom.right = rcItem.right;
rcRightBottom.bottom= rcItem.bottom;
rcRightBottom.top = rcRightBottom.bottom-m_rcBorder9grid.bottom;
::TransparentBlt(hSrcDC, rcRightBottom.left, rcRightBottom.top, rcRightBottom.Width(), rcRightBottom.Height(), memdc, m_nWidth-m_rcBorder9grid.right, m_nHeight-m_rcBorder9grid.bottom, m_rcBorder9grid.right, m_rcBorder9grid.bottom, RGB(255,0,255));
//左下角
CRect rcLeftBottom;
rcLeftBottom.left = rcItem.left;
rcLeftBottom.right = rcLeftBottom.left+m_rcBorder9grid.left;
rcLeftBottom.bottom = rcItem.bottom;
rcLeftBottom.top = rcLeftBottom.bottom-m_rcBorder9grid.bottom;
::TransparentBlt(hSrcDC, rcLeftBottom.left