Windows下面如何利用系统控件实现修改最后一行文本的效果?

星沉地动 2016-04-23 02:26:23
想这个标题想了很久。

我想要用Win32 SDK或者MFC在界面上显示运行日志的窗口,

以往都是用EDIT控件往最后面添加文本,这样每次添加一条日志就会新增一行,并滚动到最后。

但是这次不同了,某些情况下,我不需要每次都添加新行,而是修改最后一行,类似于进度显示。
比如一条日志:"Sending data... 0%",这里的0%一直递增到100%,如果像以前那样,会瞬间产生100行日志,这不是我想要的结果,我希望在日志窗口的最后一行更新这一条信息,而不换新行。


如果上面的描述不够清楚,那么这样说:
我要的效果如果在Win32控制台下面很容易,就是printf("Sending data...%d\r", rate);
注意这里的"\r",不换行,而是回到行首,继续更新这一行的内容。

我想我应该表达清楚了,好了,我来说说我能想到的方法(但是效果都不够好):
方案A:使用一个ListBox控件,每次添加日志就添加一个新行,如果遇到上面的情况,就删除最后一行,再重新添加新行。
这个方案,实现起来也比较简单,一开始看上去不错,但是当日志内容较多出现垂直滚动条之后,闪烁得就比较厉害。

方案B: 使用一个ListView控件,这个控件和ListBox相似,但是修改日志不用删除再新加,而是可以直接LVM_SETITEM,
修改最后一行的内容,但是效果和ListBox一样,内容较多时,闪烁也很明显。

方案C: 使用EDIT控件(Rich EDIT也是一样),实现起来复杂一点,要获取最后一行文本的位置,选中它,然后再REPLACESEL,结果呢,还是有明显的闪烁!!!

实再没办法了,来论坛看看有没有老手提供一个可行方案,在些多谢!!!

PS:如果EDIT控件支持"\r"该多好,可惜它不行,能找到一个支持"\r"的控件也好啊!

...全文
160 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
星沉地动 2016-04-24
  • 打赏
  • 举报
回复
引用 2 楼 hurryboylqs 的回复:
SetRedraw(FALSE); 你的代码 SetRedraw(TRUE);
这个解决方法能解决我的问题,我尝试的三种控件,都是因为闪烁太明显。 SDK下面对应的消息是WM_SETREDRAW 非常感谢!
木黑神 2016-04-23
  • 打赏
  • 举报
回复
用 EDIT 多费事,直接在客户区用TextOut
hurryboylqs 2016-04-23
  • 打赏
  • 举报
回复
SetRedraw(FALSE); 你的代码 SetRedraw(TRUE);
hurryboylqs 2016-04-23
  • 打赏
  • 举报
回复
当然有办法的,你可以不停的替换最后一行的内容 下面是例子 GetLineCount()就可以获取行数

// The string for replacing.
CString strString(_T("Hi, we're the replacements."));
int nBegin, nEnd;

// Replace the last line, if it exists, of the edit control
// with the text strString.
int  nLastLine = m_myEdit.GetLineCount()-1;
if ((nBegin = m_myEdit.LineIndex(nLastLine)) != -1)
{
   nEnd = nBegin + m_myEdit.LineLength(nBegin); 
   m_myEdit.SetSel(nBegin, nEnd);
   m_myEdit.ReplaceSel(strString);
}	

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧