C++ MFC CScrollView滚动条不工作

C++ MFC CScrollView滚动条不工作,c++,visual-c++,mfc,scrollview,mdi,C++,Visual C++,Mfc,Scrollview,Mdi,我是MFC scrollview的新手,我正在scrollview类的函数onPaint中显示大图像。下面是关于初始更新函数的代码 void CCenterImageView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class CSize sizeTotal; // TODO

我是MFC scrollview的新手,我正在scrollview类的函数onPaint中显示大图像。下面是关于初始更新函数的代码

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());
    }


}

通过使用它,我可以看到垂直和水平滚动,但按下它们不会改变视图上的任何内容。请指导我如何在用户单击时移动滚动条并更改视图

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

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

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


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

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

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

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

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

您的代码看起来可疑(第3个参数)。但是,如果它与32K以上的滚动问题有关,请参阅知识库文章“PRB:CScrollView滚动范围限制为32K”(文章ID:166473)。

您的代码看起来可疑(第3个参数)。但是,如果它与32K以上的滚动问题有关,请参阅知识库文章“PRB:CScrollView滚动范围限制为32K”(文章ID:166473)