设为首页 加入收藏

TOP

VC按钮自绘的简单实现(二)
2015-11-21 03:28:02 】 浏览:2716
Tags:按钮 简单 实现
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
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇经验之谈―项目如何分模块(MVC) 下一篇vc获得窗口并枚举其子窗口

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目