MFC使用滚动条显示大图片

本文提供两种方法来解决MFC中使用滚动条来显示大图片的问题。

方法1:
直接使用MFC中的滚动条控件,关键代码如下

void CScrollPicDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    if (NULL == hDC)
    {
        return;
    }
    else
    {
        int iNowPos;
        switch (nSBCode)
        {
            SCROLLINFO ver;
        case SB_THUMBPOSITION:
        case SB_THUMBTRACK: //拖动滑块
            ZeroMemory(&ver, sizeof(ver));
            ver.cbSize = sizeof(ver);
            ver.fMask = SIF_TRACKPOS;
            m_hScrollBar.GetScrollInfo(&ver);
            m_pointx = ver.nTrackPos;
            ZeroMemory(&ver, sizeof(ver));
            ver.cbSize = sizeof(ver);
            ver.fMask = SIF_POS;
            ver.nPos = m_pointx;
            m_hScrollBar.SetScrollInfo(&ver);
            PicShow();
            break;       
        case SB_PAGERIGHT: //单击箭头与滚块之间的区域
        case SB_LINERIGHT: //单击滚动条向右的箭头
            ZeroMemory(&ver, sizeof(ver));
            ver.cbSize = sizeof(ver);
            m_hScrollBar.GetScrollInfo(&ver, SIF_POS);
            iNowPos = ver.nPos;
            iNowPos = iNowPos + 20;
            if (iNowPos > m_MaxWidth - Swidth)
                iNowPos = m_MaxWidth - Swidth;
            m_hScrollBar.SetScrollPos(iNowPos);
            m_pointx = iNowPos;
            PicShow();
            break;
        case SB_PAGELEFT: //单击箭头与滚块之间的区域
        case SB_LINELEFT: //单击滚动条向左的箭头
            ZeroMemory(&ver, sizeof(ver));
            ver.cbSize = sizeof(ver);
            m_hScrollBar.GetScrollInfo(&ver, SIF_POS);
            iNowPos = ver.nPos;
            iNowPos = iNowPos - 20;
            if (iNowPos < m_MinWidth)
                iNowPos = m_MinWidth;
            m_hScrollBar.SetScrollPos(iNowPos); 
            m_pointx = iNowPos;
            PicShow();
            break;
        default:
            break;
        }
    }

    CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

方法2:
通过重载CButton类,在CButton上实现带滚动条的图片显示控件,在DrawItem函数当中我们实现在CButton上画图操作即可。另外滚动条的实现直接调用ShowScrollBar函数来显示滚动条,通过SetScrollRange来设置最大和最小可以滚动到的位置,通过SetScrollInfo函数来设置滚动条的长度。拖动滚动条的实现图片的区域显示,通过在OnVScroll和OnHScroll消息函数当中实现。关键代码如下

// 滚动条消息函数
void CButtonPic::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    // TODO: Add your message handler code here and/or call default
    switch(nSBCode)
    {
    case SB_LEFT:
        m_nHorzPos = 0;
        this->SetScrollPos(SB_HORZ,m_nHorzPos);
        DarwPic();
        break;
    case SB_LINELEFT:
    case SB_PAGELEFT:
        m_nHorzPos -= m_nOneStep;
        if(m_nHorzPos<0)
            m_nHorzPos = 0;
        this->SetScrollPos(SB_HORZ,m_nHorzPos);
        DarwPic();
        break;
    case SB_LINERIGHT:
    case SB_PAGERIGHT:
        m_nHorzPos += m_nOneStep;
        if(m_nHorzPos>m_nHorzMaxSize)
            m_nHorzPos = m_nHorzMaxSize;
        this->SetScrollPos(SB_HORZ,m_nHorzPos);
        DarwPic();
        break;
    case SB_RIGHT:
        m_nHorzPos = m_nHorzMaxSize;
        this->SetScrollPos(SB_HORZ,m_nHorzPos);
        DarwPic();
        break;
    case SB_THUMBPOSITION:
    case SB_THUMBTRACK:
        m_nHorzPos = nPos;
        this->SetScrollPos(SB_HORZ,m_nHorzPos);
        DarwPic();
        break;
    default:
        break;
    }
    CButton::OnHScroll(nSBCode, nPos, pScrollBar);
}

//  图片显示函数
void CButtonPic::DarwPic()
{
    CDC* pDC = this->GetDC();
    CRect rc;
    this->GetClientRect(&rc);
    CBitmap cbmp;
    BITMAP bm;
    LoadJpg(cbmp,m_uiSourcePic);
    cbmp.GetBitmap(&bm);
    CDC dcImage;
    dcImage.CreateCompatibleDC(pDC); 
    dcImage.SelectObject(&cbmp);
    //画图
    pDC->StretchBlt(0,0,rc.Width(),rc.Height(), &dcImage,m_nHorzPos ,m_nVertPos,rc.Width(),rc.Height(),SRCCOPY);
}

运行效果如下图:
MFC使用滚动条显示大图片_第1张图片

两种解决方案的代码我已上传到
http://download.csdn.net/detail/yushitou27/9389225;
http://download.csdn.net/detail/yushitou27/9389292;

你可能感兴趣的:(C++,MFC)