VC按钮自绘的简单实现(二)

2015-11-21 03:28:02 · 作者: · 浏览: 252
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    = b
itmap.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