c++ - MFC CScrollView 滚动不工作

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

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

最佳答案

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

然后,当您处理 OnDraw 时,您可以绘制整个图像,就像您所做的那样,或者您可以只绘制显示的部分,您可以从 GetClipBox 中找到。后者只是为了提高效率所必需的,因为 CScrollView 会剪掉不可见的部分。

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

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

关于c++ - MFC CScrollView 滚动不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12975052/

相关文章:

c++ - 在 Qt 插件类中读取自己的元数据

c++ - 如何创建一个返回数组的函数

c++ - afxdb.h 错误?

c++ - 将 png 资源加载到 CBitMap 中

c++ - 使用MAP文件 VS2010 MFC

c++ - 在C++中处理大量数据

c++ - 递归迭代而不重新绑定(bind)引用

C++ 沙盒动态库

c++ - 对 C++ 异常处理很困惑

visual-c++ - 从另一个线程调用 lua 函数(作为回调)是否足够安全?