我有一个ATL控件,实现了IOleObject,IViewObjectEx,IDispatch,IPersist等接口,并且把这个控件的实例加入到了一个CRichEditCtrl。
问题是当我这个控件的表现有改变时,不知道如何通知这个CRichEditCtrl重新调用一次这个控件的IViewObjectEx::Draw()方法,也就是即使控件的数据改变了,还是没有办法即时把这种改变表现在界面上,非要等这个CRichEditCtrl由其它时间导致刷新。
请问哪位有办法解决这个问题呢?

解决方案 »

  1.   

    给RichEdit控件窗口发一个InvalidateRect试试。
      

  2.   

    试了一下,界面有闪烁,而且定位也有问题,还有只要是用键盘在edit里面输入了东西,更新又会自动停止
      

  3.   

    不闪烁是不可能的,除非你的对象自带一个窗体。更新停止可能是你的对象deactive了
      

  4.   

    另外还有一个问题,我在重写的IOleObject::Close()上写了一句this->Release(),以在关闭的时候释放对象,但是有时候在这个Ole对象被CRichEditCtrl删除的时候就会出现问题。但如果我不加这句,Ole对象在被删除后又没有释放,造成内存泄漏,究竟应该如何实现IOleObject才能够正确地避免内存泄漏呢?
      

  5.   

    Close里面Release肯定出问题。出现资源泄漏多半是你哪里AddRef之后忘记Release,你都用智能指针就可以避免这个问题了。
      

  6.   

    有Release(),应该不是这个问题。
      

  7.   

    解决最后这个问题就结贴:怎么知道一个ATL控件在CRichEditCtrl中的位置?
      

  8.   

    是我自己实现的ATL控件,所以千万别告诉我调用IViewObjectEx::GetRect(),这个方法的ATL默认实现只是返回E_NOTIMPL。