MFC CScrollView滚动不起作用

时间:2012-10-19 13:14:13

标签: c++ visual-c++ mfc scrollview mdi

我是使用MFC scrollview的新手,我在ScrollView类的onPaint函数中显示大图像。这是代码

之后的On初始更新函数
void CCenterImageView::OnInitialUpdate()
{
    CScrollView::OnInitialUpdate();

    // TODO: Add your specialized code here and/or call the base class

    CSize sizeTotal;
    // TODO: calculate the total size of this view
    sizeTotal.cx = m_matImage.cols;
    sizeTotal.cy = m_matImage.rows;
    SetScrollSizes(MM_TEXT, sizeTotal,sizeTotal);

}

void CCenterImageView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // TODO: Add your message handler code here and/or call default

    CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);

    //Invalidate();
}

void CCenterImageView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // TODO: Add your message handler code here and/or call default

    CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
    UpdateData();
    //Invalidate();
}

void CCenterImageView::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    // TODO: Add your message handler code here
    // Do not call CView::OnPaint() for painting messages

    if(m_CVvImageObj.GetImage())
    {       
        //this function blit the bitmap on the screen height and width are more than 1000 pixels
        m_CVvImageObj.Show(dc.GetSafeHdc(),0,0,m_CVvImageObj.Width(),m_CVvImageObj.Height());
    }


}

通过使用此http://www.functionx.com/visualc/views/scrollview.htm我可以看到垂直和水平滚动但按下它们不会改变视图上的任何内容。请指导我如何移动用户点击滚动并更改视图?

2 个答案:

答案 0 :(得分:1)

CScrollView就像在大画布上绘画一样,使用SetScrollSizes确定其大小。您设置的大小通常是整个图像的大小,很可能大于显示它的窗口。

然后,当您处理OnDraw时,您可以像完成一样绘制整个图像,或者只绘制正在显示的部分,您可以从GetClipBox中找到该部分。后者仅对提高效率是必要的,因为CScrollView将剪切不可见的部分。

根本不需要OnXScroll处理程序。您应该删除它们并让CScrollView处理滚动,如果这是您为响应滚动而做的全部。

如果您的图片尺寸>> = 2 ^ 15,则会出现问题,但这听起来不像您的情况。

答案 1 :(得分:0)

你的代码看起来很可疑(第3个参数)。但是,如果它与滚动超过32K的问题有关,请参阅知识库文章'PRB:CScrollView Scroll Range Limited Limited to 32K'(文章编号:166473)。