解决方案 »

  1.   

    windowless就麻烦了,简单一点就是自绘按钮,不规则透明按钮,贴个图,然后在上面写字就行了
      

  2.   

    QQ是DirctUI, 完全自绘的.只要能实现这样的效果就好, 别人怎么做的, 并不是很重要, 除非是你还处于研究阶段, 到是可以逆向一下, 研究别个怎么实现的.
      

  3.   

    看大家的发言,动不动就自己写。
    如果写一个比较完善的richedit,还是且花费不少时间呢。
    这里,我不说自己如何实现。只是分析QQ气泡模式的实现方式!
      

  4.   

    嘿嘿,这个功能表示已经实现了, 用的是html代码,简单很多, 你要是用MFC写,那真要命。
      

  5.   


    曾经也以为是分两层实现的,但再想想这种方法很难做到与文字同步。
    要做气泡,有两个难点:
    1. 气泡背景怎么画
    2. 文字如何布局画气泡背景,这里要使用一个技巧,QQ里面应该大量采用了这种方式。将Ole的大小设置为(1,1),用于占位,但在绘制的时候先将气泡画上,然后再调用m_spTextServices->TxDraw画上文字。
    至于气泡的位置,在插入一段内容时要记录下这段内容的start cp、end cp,用这两个值去获取相应的坐标,计算出内容大小。文字的布局,也以为是采用右对齐,但错了。后来通过一些方法拿到qq的richedit rtf流,发现采用的就是缩进而已,通过内容大小就也可以计算也相应的左右缩进。
      

  6.   


    插入大小为(1,1)的占位ole,你的意思是,气泡是一个ole吗?
    QQ的应该不是。
    烦请分享一下:插入占位Ole的目的是做什么的啊?
      

  7.   

    测试了下,的确不需要把气泡做成ole也行,只要让气泡维护文本的开始位置和结束位置就可以了。不过我这个气泡现在还有一个bug,tab占用的宽度和它所处的位置有关系,如果一行中有tab制表符可能导致文本宽度计算错误.
      

  8.   


    可以这样:
    插入到richedit的时候,通过ITextRange 的GetPoint获取 范围,然后根据edit的大小,设置小缩进。应该就可以了。
      

  9.   


    例如一个右对齐的气泡,在窗口大小改变时,要重新更新缩进,可以这样:
    1. 将这个气泡的内容左对齐,测量出正常状态下气泡内容的宽和高。
    2. 然后用richedit的宽度减去气泡内容的宽度,就可以拿到缩进值了。把这个值作为新的left-indent即可需要注意的是,在readonly状态下的richedit设置indent会失败,需要对readonly 状态做下修改
      

  10.   


    例如一个右对齐的气泡,在窗口大小改变时,要重新更新缩进,可以这样:
    1. 将这个气泡的内容左对齐,测量出正常状态下气泡内容的宽和高。
    2. 然后用richedit的宽度减去气泡内容的宽度,就可以拿到缩进值了。把这个值作为新的left-indent即可需要注意的是,在readonly状态下的richedit设置indent会失败,需要对readonly 状态做下修改
    readonly这个问题也有发现,现在还有的问题就是setindent会回调txsetscrollpos导致部分背景计算不准确(在拖拉改变对话框宽度的时候)。还有一个问题就是由于autovscroll同样导致txsetscrollpos回调,现在把autovscroll去掉自己来接管setsel,但这样drag-drop就不好做了,我的q913182446,想要请教一下把这个东西做好