【问题标题】:How to get CEdit to scroll properly?如何让 CEdit 正确滚动?
【发布时间】:2010-12-04 07:51:13
【问题描述】:

我有一个用于显示诊断输出的 CEdit 控件。
有时数据会溢出屏幕大小,所以我很自然地将 Vertical Scroll 属性设置为 true(MFC 对话框编辑器)。

但是,当我尝试滚动之前在窗口中的文本时,它并没有被清除,而是新的文本被覆盖了。

结果是我滚动过去的所有内容都一团糟。

我一直在寻找绘制背景属性或类似的东西,它会在滚动时擦除窗口中的所有内容(在重绘新数据之前)。

有什么建议吗?

【问题讨论】:

    标签: mfc scroll artifacts cedit


    【解决方案1】:

    我认为您可能希望将 Auto VScrollMultiline 设置为 true,并将 Auto HScroll 设置为 false。

    【讨论】:

    • 一切都已经按照你的建议设置好了,除了 auto HScroll,它没有任何效果。
    【解决方案2】:

    我们遇到了类似的问题。当我们获得 WM_VSCROLL 时,我们最终不得不使父窗口的区域无效以使其更新。我试着按照用户 demorge 所说的做:

    SetBkMode(hdc, TRANSPARENT) doesn't work

    但是我们的代码没有使用句柄,我们实际上使用了 CWnd 类,所以我们最终在 WindowProc 中这样做:

    switch(message)
    {
    ...
    case WM_VSCROLL:
    case WM_HSCROLL:
      LRESULT answer;
      PAINTSTRUCT ps;
      CDC* pdc;
      CWnd* MyParentHWnd;
    
      // We want the scroll to work the same way it has always worked for our
      // ancestor class.  Let them handle the scrolling and save off their
      // return.
      answer = AncestorClass::WindowProc(message, wParam, lParam);
    
      pdc = BeginPaint(&ps);
      // DO NOT change the assignement operator in the conditional below to an
      // equality operator.  We are actually trying to get the parent window and
      // and storing locally, and then verifying that we didn't get back null.
      // This is a purposeful design decision.
      if (MyParentHWnd = GetParent()){
         RECT MyRect;
         GetClientRect(&MyRect);
         ClientToScreen(&MyRect);
         MyParentHWnd->ScreenToClient(&MyRect);
         MyParentHWnd->InvalidateRect(&MyRect);
      }
    
      EndPaint(&ps);
    
      return answer;
      break;
    ...
    }
    

    当然,我不得不将它泛化一点。我只是想让你知道,是的,还有其他人看到了你的问题,我们找到了解决方法。

    【讨论】:

      【解决方案3】:

      我使用 MFC 8.0 附带的 VS2005 对此进行了测试。我无法复制您的问题。

      我在基于对话框的应用程序中添加了一个 CEdit 和一个 CRichEditCtrl。将 Multiline、Auto VSCroll 和 Vertical Scroll 属性更改为 true。使用 SetWindowText 方法将 loooooong 文本字符串放入它们两者。我启动了应用程序,文本滚动得很好。

      你做了什么不同的事情?

      只是为了确定。您没有使用 SetCaretPos 方法,是吗?在 MSDN 页面中有一些关于此的说明。这是Knowledge Base article

      【讨论】:

      • 我似乎记得在某处的代码中看到过 SetCaretPos 方法,我会在我回来工作时检查。感谢您的提示。
      • 另外,我正在使用 2003,因为它是旧代码,因此也可能会影响它。
      • 添加了指向有关 SetCaretPos 的知识库文章的直接链接。遗憾的是,它没有描述在 CEdit 中使用 SetCaretPos 的可能症状。文章是为 Visual C++ 4.2 中使用的 MFC 4.2 编写的,所以从那时起它可能已被修复。试穿并告诉我们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多