Mfc 如何让CEdit正确滚动?

Mfc 如何让CEdit正确滚动?,mfc,scroll,artifacts,cedit,Mfc,Scroll,Artifacts,Cedit,我有一个CEdit控件,用于显示诊断输出。 有时数据会溢出屏幕大小,因此我自然会将垂直滚动属性设置为true(MFC对话框编辑器) 但是,当我试图滚动之前在窗口中的文本时,它没有被清除,新的文本被写在上面 结果是我浏览过的所有东西都乱七八糟 我一直在寻找一个draw background属性或类似的东西,它会在滚动时(在重新绘制新数据之前)擦除窗口中的所有内容 有什么建议吗?我想您可能需要将自动VSCROL和多行设置为true,将自动HSCROL设置为false。我想您可能需要将自动VSCROL

我有一个CEdit控件,用于显示诊断输出。
有时数据会溢出屏幕大小,因此我自然会将垂直滚动属性设置为true(MFC对话框编辑器)

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

结果是我浏览过的所有东西都乱七八糟

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


有什么建议吗?

我想您可能需要将自动VSCROL多行设置为true,将自动HSCROL设置为false。

我想您可能需要将自动VSCROL多行设置为true,和Auto-HScroll变为false。

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

我在一个基于对话框的应用程序中添加了一个CEdit和一个CRichEditCtrl。将多行、自动VSCroll和垂直滚动特性更改为true。使用SetWindowText方法将Looooong字符串的文本放在两个窗口中。我启动了应用程序,文本滚动很好

你有什么不同的做法


只是想确定一下。您没有使用SetCaretPos方法,是吗?MSDN页面上有一些关于这方面的注释。以下是。

我用随MFC 8.0提供的VS2005测试了这一点。我无法复制你的问题

我在一个基于对话框的应用程序中添加了一个CEdit和一个CRichEditCtrl。将多行、自动VSCroll和垂直滚动特性更改为true。使用SetWindowText方法将Looooong字符串的文本放在两个窗口中。我启动了应用程序,文本滚动很好

你有什么不同的做法


只是想确定一下。您没有使用SetCaretPos方法,是吗?MSDN页面上有一些关于这方面的注释。以下是问题。

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

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

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

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

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

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

除了auto-HScroll之外,一切都已经按照你的建议进行了设置,但是auto-HScroll没有效果。除了auto-HScroll之外,一切都已经按照你的建议进行了设置,我似乎记得在代码中的某个地方看到过SetCaretPos方法,我回去工作时会检查。谢谢你的提示。另外,我正在使用2003,因为它是旧代码,所以可能也会影响它。添加了有关SetCaretPos的知识库文章的直接链接。遗憾的是,它没有描述在CEdit中使用SetCaretPos可能出现的症状。文章是为MFC 4.2编写的,它在Visual C++ 4.2中使用,所以可能从此以后就被修复了。试一下,让我们知道。我似乎记得在代码中的某个地方看到过SetCaretPos方法,我会在回去工作时检查。谢谢你的提示。另外,我正在使用2003,因为它是旧代码,所以可能也会影响它。添加了有关SetCaretPos的知识库文章的直接链接。遗憾的是,它没有描述在CEdit中使用SetCaretPos可能出现的症状。文章是为MFC 4.2编写的,它在Visual C++ 4.2中使用,所以可能从此以后就被修复了。试穿一下,让我们知道。