我有一个用于显示诊断输出的 CEdit 控件。
有时数据会溢出屏幕大小,所以我很自然地将 Vertical Scroll 属性设置为 true(MFC 对话框编辑器)。
但是,当我尝试滚动之前在窗口中的文本时,它并没有被清除并且新的文本被写在上面。
结果是我滚动过去的所有内容都变得一团糟。
我一直在寻找绘制背景属性或类似的东西,它们会在滚动时擦除窗口中的所有内容(在重绘新数据之前)。
有什么建议么?
我认为您可能希望将Auto VScroll和Multiline设置为 true,并将Auto HScroll设置为 false。
我们遇到了类似的问题。当我们获得 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;
...
}
当然,我不得不把它泛化一点。我只是想让你知道,是的,还有其他人看到了你的问题,我们找到了解决方法。
我用 MFC 8.0 附带的 VS2005 对此进行了测试。我无法复制你的问题。
我在基于对话框的应用程序中添加了一个 CEdit 和一个 CRichEditCtrl。将 Multiline、Auto VSCroll 和 Vertical Scroll 属性更改为 true。使用 SetWindowText 方法将 loooooong 文本字符串放入它们两者。我启动了应用程序,文本滚动得很好。
你做了什么不同的事情?
只是要确定。您没有使用 SetCaretPos 方法,是吗?在 MSDN 页面中有一些关于此的说明。这是知识库文章。