QQ2014的气泡形式的实现方法

QQ2014的气泡模式的实现方法
猜测了下QQ的气泡模式的实现方法:

分为两层,上面一层是windowless richedit, 透明模式;下面一层一个容器,包含有用户头像和气泡图片;下面一层随richedit一起滚动。

添加每一个paragraph后,可以得到这个段落的rang的左上角和右下角,从而得到该paragraph所在的矩形区域rect。然后就在下层的容器中,插入一个气泡,设置其rect;richedit滚动的时候,下层容器处理下事件。

不知道对不对?
------解决方案--------------------
用html是不是简单一些?
------解决方案--------------------
windowless就麻烦了,简单一点就是自绘按钮,不规则透明按钮,贴个图,然后在上面写字就行了
------解决方案--------------------
要实现的方法很多,最简单的方法,一个窗口搞掂。
------解决方案--------------------
不管对不对只要能实现就行
------解决方案--------------------
QQ是DirctUI, 完全自绘的.

只要能实现这样的效果就好, 别人怎么做的, 并不是很重要, 除非是你还处于研究阶段, 到是可以逆向一下, 研究别个怎么实现的.
------解决方案--------------------
无逆向,不分析。
------解决方案--------------------
嘿嘿,这个功能表示已经实现了, 用的是html代码,简单很多, 你要是用MFC写,那真要命。
------解决方案--------------------
QQ2014的气泡形式的实现方法
曾经也以为是分两层实现的,但再想想这种方法很难做到与文字同步。
要做气泡,有两个难点:
1. 气泡背景怎么画
2. 文字如何布局

画气泡背景,这里要使用一个技巧,QQ里面应该大量采用了这种方式。将Ole的大小设置为(1,1),用于占位,但在绘制的时候先将气泡画上,然后再调用m_spTextServices->TxDraw画上文字。
至于气泡的位置,在插入一段内容时要记录下这段内容的start cp、end cp,用这两个值去获取相应的坐标,计算出内容大小。

文字的布局,也以为是采用右对齐,但错了。后来通过一些方法拿到qq的richedit rtf流,发现采用的就是缩进而已,通过内容大小就也可以计算也相应的左右缩进。
------解决方案--------------------
测试了下,的确不需要把气泡做成ole也行,只要让气泡维护文本的开始位置和结束位置就可以了。

不过我这个气泡现在还有一个bug,tab占用的宽度和它所处的位置有关系,如果一行中有tab制表符可能导致文本宽度计算错误.