zhangjun008 2013-10-31 08:41 采纳率: 0%
浏览 1424

怎样在vc++多文档滚动视图中,用鼠标拖动滚动条,屏幕内容不变,自己处理显示内容

我用vc++做了一个多文档程序,并用使用了滚动视图。现在,我想不使用系统提供的滚动功能,就是说,当我把滚动条拖动到某一位置后,屏幕显示内容不是有系统自动进行滚动,而是由我自己滚据滚动条的位置来处理显示内容,请问如何做?

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-08 00:45
    关注

    该回答引用ChatGPT

    您可以通过重写滚动视图的OnScroll函数来处理滚动条拖动事件,并根据滚动条位置计算显示内容的偏移量。


    以下是一个示例代码:

    void CMyScrollView::OnInitialUpdate()
    {
        CScrollView::OnInitialUpdate();
        SetScrollSizes(MM_TEXT, CSize(0, 0)); // 禁用系统的滚动条
    }
    
    void CMyScrollView::OnDraw(CDC* pDC)
    {
        // 根据滚动条位置计算需要显示的内容的偏移量
        int nHorzPos = GetScrollPos(SB_HORZ);
        int nVertPos = GetScrollPos(SB_VERT);
        int nPixelX = nHorzPos * m_nContentWidth / m_nScrollWidth;
        int nPixelY = nVertPos * m_nContentHeight / m_nScrollHeight;
    
        // 绘制内容,使用偏移量调整绘制位置
        pDC->SetViewportOrg(-nPixelX, -nPixelY);
        // 绘制内容的代码
        // ...
    
        pDC->SetViewportOrg(0, 0);
    }
    
    void CMyScrollView::OnScroll(UINT nSBCode, UINT nPos, BOOL bDoScroll)
    {
        // 处理滚动条拖动事件,不使用系统的滚动功能
        if (nSBCode == SB_THUMBTRACK || nSBCode == SB_THUMBPOSITION)
        {
            SetScrollPos(SB_HORZ, nPos); // 设置水平滚动条位置
            SetScrollPos(SB_VERT, nPos); // 设置垂直滚动条位置
            RedrawWindow(); // 重绘视图
        }
        else
        {
            CScrollView::OnScroll(nSBCode, nPos, bDoScroll); // 调用基类的实现
        }
    }
    

    在上述代码中,我们在OnInitialUpdate函数中禁用了系统的滚动条,然后在OnDraw函数中根据滚动条位置计算需要显示的内容的偏移量,并使用偏移量调整绘制位置。


    在OnScroll函数中,我们检查滚动条事件的类型,如果是拖动事件,则手动设置滚动条位置并重绘视图;否则,调用基类的实现以使用系统的滚动功能。


    请根据您的具体需求调整代码。

    评论

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配