CRichEditCtrl诡异的问题,对MFC焦点机制深入了解的来,随时跟帖

mudunke775 2011-04-08 11:45:44
目的:在CRichEditCtrl的光标处插入字符串,使用ReplaceSel()函数。

问题:使用ReplaceSel()函数后,原文本被覆盖。举例:字符串"11",在2个1中间(光标处)插入"a",结果变成:"a",将原字符串覆盖了。

调试及结果:因为我的m_RichEdit是Tabstop的第一位,所以窗口出现时焦点是在m_RichEdit上的(要求是这样的)。现我将第一位焦点移动到其他控件上后,ReplaceSel()函数好用了,是在光标处插入而不是覆盖。

新建了个工程,也是将焦点第一位放到m_RichEdit上,ReplaceSel()函数同样好用。

因为代码太多,无法贴出全部。想请各位大大帮我诊断下,给点经验之谈或是建议,如何解决,为什么会出现这种情况,分不多,就50,谢谢。

...全文
196 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
h100037 2011-04-08
  • 打赏
  • 举报
回复
SetFocus 试下呢
向立天 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mudunke775 的回复:]

TO:VisualEleven
我自己也新建个工程试了下,确实没问题,但原工程太大了,全部新建重做工作量太大了
[/Quote]你要是这么说那这个问题就不好分析了
Eleven 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mudunke775 的回复:]
调试及结果:(补充)
我新建个CRichEditCtrl对象,使用的是动态Create创建,结果相同,第一焦点就覆盖,不是第一焦点就好用
[/Quote]
动态创建也没有这个问题~
mudunke775 2011-04-08
  • 打赏
  • 举报
回复
TO:VisualEleven
我自己也新建个工程试了下,确实没问题,但原工程太大了,全部新建重做工作量太大了
mudunke775 2011-04-08
  • 打赏
  • 举报
回复
调试及结果:(补充)
我新建个CRichEditCtrl对象,使用的是动态Create创建,结果相同,第一焦点就覆盖,不是第一焦点就好用
Eleven 2011-04-08
  • 打赏
  • 举报
回复
用VC6测试了一下,没有问题~
sjdev 2011-04-08
  • 打赏
  • 举报
回复
の,不会我给的答案楼主都没看吧。
mudunke775 2011-04-08
  • 打赏
  • 举报
回复
问题已解决,并找到的问题所在。

因为CRichEditCtrl所在窗口曾失去焦点(打开了其他窗口),所以在窗口重新获得焦点时,会将第一焦点重新设置到第一控件上,而我的第一控件是CRichEditCtrl,所以窗口将原来的光标位置重置了,我用m_RichEdit.GetSel(m_nStartChar,m_nEndChar);发现已经被改成了0-最大。

所以解决的办法是在窗口失去焦点前纪录光标位置,在重新得到焦点时再设置光标位置。如果不是第一焦点控件,该控件的光标位置会一直保存,所以不会出现这种问题。

VisualEleven,你可以试下,第一焦点控件为CRichEditCtrl,输入一些内容,然后最小化(失去窗口焦点),然后再最大化,你会发现你输入的内容被全部选中了,也就是m_nStartChar,m_nEndChar已经被系统改变!

谢谢大家,结贴
mudunke775 2011-04-08
  • 打赏
  • 举报
回复
使用了最原始的方法,一段一段的注释,找到了问题所在,但是还是不知道如何解决。

原因:m_RichEdit.ReplaceSel(_strText);是通过另一个对话框发送了一个自定义消息过来的时候,在消息处理函数当中执行的。可能是由于此消息在处理时,焦点还没有回来吧。

正在寻找解决办法,找到后会公开出来
mudunke775 2011-04-08
  • 打赏
  • 举报
回复
TO:h100037

在初始化的时候,SetFocus函数没任何作用

m_RichEdit.MoveWindow(1,339,383,64);
m_RichEdit.LimitText(500);
m_RichEdit.SetFocus();

这是在初始化中的代码,最后那个SetFocus()加不加没任何区别,第一焦点不是由这个决定的,是在资源文件里的BEGIN-END里的控件顺序而定
sjdev 2011-04-08
  • 打赏
  • 举报
回复
在光标处插入文本~

long start, end;
m_richEditCtrl.GetSel(start,end);
m_richEditCtrl.SetSel(end, end);
m_richEditCtrl.ReplaceSel()......

15,979

社区成员

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

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