1

我是使用 MFC 滚动视图的新手,我在 ScrollView 类的 onPaint 函数中显示大图像。这是以下代码的 On initial update 功能

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我可以看到垂直和水平滚动,但按下它们不会改变视图上的任何内容。请指导我如何在用户点击时移动滚动并更改视图?

4

2 回答 2

1

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

然后,当您处理 OnDraw 时,您可以像之前那样绘制整个图像,也可以只绘制正在显示的部分,这可以从 GetClipBox 中找到。后者仅是提高效率所必需的,因为 CScrollView 将剪切不可见的部分。

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

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

于 2013-01-18T07:10:02.547 回答
0

您的代码看起来很可疑(第三个参数)。但是如果和滚动到32K以上的问题有关,请看知识库文章'PRB: CScrollView Scroll Range Limited to 32K'(文章ID:166473)。

于 2013-07-21T14:23:25.903 回答