关于TRichEdit输出数据时暂停显示的问题

Mr.Chronos 2010-05-04 07:05:06
各位大侠,我面临的是这样一个问题:
假如TRichEdit在不断的接收数据并显示出来,也就是不断的richedit->Lines->Add(s);
这个时候滚动条也会不断的往下滚动并在控件末尾处显示出当前插入的数据。

在某个时刻,我希望暂停下来,也就是在 richedit->Lines->Add(s);这个操作不断进行的条件下如何实现当前屏幕上的数据不被重新刷新,并且滚动条依然能够根据插入的数据而做出相应的变化。

这个问题我跟了很久,但是依然没有解决,想到过的办法也千奇百怪,比如我发现当RichEdit控件失去焦点时的表现形式就很接近我的目的,所以我曾经试图在暂停的时候发送WM_KILLFOUCS消息,但是没有成功。另外,我也发现当Add一条数据的时候,系统会发送WM_PAINT消息,我也试图截获这个消息,然后在这里不断重新刷新当前数据,遗憾的是没有成功,我也不知道问题出在哪里。还望各位大侠不吝赐教,小弟在此感激不尽了,谢谢!
...全文
93 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
suine 2010-05-05
  • 打赏
  • 举报
回复
你没有必要不停刷新RichEdit..就算你刷了,人的眼睛也跟不上...
如果不停接收数据的话,可以先放到一个TStringList或String里,隔固定时间写进RichEdit里就行了.
Mr.Chronos 2010-05-05
  • 打赏
  • 举报
回复
多谢两位大侠指点,小弟受益匪浅。

不过我发现在这样情况下,暂停的时候无法选中控件中的文本,这应该和不断刷新有关系吧?

这个方法还没试过:SendMessage(RichEdit1->Handle, EM_REPLACESEL, 1, LongInt(s));
不知道会有什么样的表现形式,等吃了饭再来试试。

我觉得在暂停的时候要选中文本,这个难度相当大哦~
那必须要停止文本的刷新吧...猜测....


suine 2010-05-05
  • 打赏
  • 举报
回复
同意五楼

int CurrentLine;
RichEdit1->Lines->BeginUpdate();
CurrentLine = RichEdit1->Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
RichEdit1->Lines->Add(L"哈哈,这是新加的一行" + String(i++));
RichEdit1->Perform(EM_LINESCROLL, 0, -RichEdit1->Lines->Count);
RichEdit1->Perform(EM_LINESCROLL, 0, CurrentLine);
RichEdit1->Lines->EndUpdate();

[Quote=引用 5 楼 zhouzhangkui 的回复:]

C/C++ code

RichEdit1->Lines->BeginUpdate() ;
//your code
RichEdit1->Lines->EndUpdate() ;
[/Quote]
周药师 2010-05-05
  • 打赏
  • 举报
回复
SendMessage(RichEdit1->Handle, EM_REPLACESEL, 1, LongInt(s));
或者用这个试试
suine 2010-05-05
  • 打赏
  • 举报
回复
你可以Add很多Lines再Perform啊..另外RichEdit的行数别太多了...
周药师 2010-05-05
  • 打赏
  • 举报
回复

RichEdit1->Lines->BeginUpdate() ;
//your code
RichEdit1->Lines->EndUpdate() ;
Mr.Chronos 2010-05-05
  • 打赏
  • 举报
回复
suine:

谢谢你的回复!
我用过你的方法了,的确可以实现,不过屏幕闪烁的太厉害了
suine 2010-05-04
  • 打赏
  • 举报
回复

int CurrentLine;
CurrentLine = RichEdit1->Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
RichEdit1->Lines->Add(L"哈哈,这是新加的一行" + String(i++));
RichEdit1->Perform(EM_LINESCROLL, 0, -RichEdit1->Lines->Count);
RichEdit1->Perform(EM_LINESCROLL, 0, CurrentLine);
suine 2010-05-04
  • 打赏
  • 举报
回复
在Lines->Add(s);后面加上
[/color]

RichEdit1->Perform(EM_LINESCROLL,0,-RichEdit1->Lines->Count);
RichEdit1->Perform(EM_LINESCROLL,0,你要定位的行);
suine 2010-05-04
  • 打赏
  • 举报
回复

RichEdit1->Perform(EM_LINESCROLL,0,5-RichEdit1->Lines->Count);

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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