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