0

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

但是,当我尝试滚动之前在窗口中的文本时,它并没有被清除并且新的文本被写在上面。

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

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

有什么建议么?

4

3 回答 3

2

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

于 2009-10-06T17:11:36.863 回答
1

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

SetBkMode(hdc, TRANSPARENT) 不起作用

但是我们的代码没有使用句柄,我们实际上使用了 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;
...
}

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

于 2015-04-03T21:42:29.793 回答
0

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

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

你做了什么不同的事情?

只是要确定。您没有使用 SetCaretPos 方法,是吗?在 MSDN 页面中有一些关于此的说明。这是知识库文章

于 2009-10-09T06:14:15.767 回答