QQ2014的气泡模式的实现方法 qq气泡模式实现方法 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 windowless就麻烦了,简单一点就是自绘按钮,不规则透明按钮,贴个图,然后在上面写字就行了 QQ是DirctUI, 完全自绘的.只要能实现这样的效果就好, 别人怎么做的, 并不是很重要, 除非是你还处于研究阶段, 到是可以逆向一下, 研究别个怎么实现的. 看大家的发言,动不动就自己写。如果写一个比较完善的richedit,还是且花费不少时间呢。这里,我不说自己如何实现。只是分析QQ气泡模式的实现方式! 嘿嘿,这个功能表示已经实现了, 用的是html代码,简单很多, 你要是用MFC写,那真要命。 曾经也以为是分两层实现的,但再想想这种方法很难做到与文字同步。要做气泡,有两个难点:1. 气泡背景怎么画2. 文字如何布局画气泡背景,这里要使用一个技巧,QQ里面应该大量采用了这种方式。将Ole的大小设置为(1,1),用于占位,但在绘制的时候先将气泡画上,然后再调用m_spTextServices->TxDraw画上文字。至于气泡的位置,在插入一段内容时要记录下这段内容的start cp、end cp,用这两个值去获取相应的坐标,计算出内容大小。文字的布局,也以为是采用右对齐,但错了。后来通过一些方法拿到qq的richedit rtf流,发现采用的就是缩进而已,通过内容大小就也可以计算也相应的左右缩进。 插入大小为(1,1)的占位ole,你的意思是,气泡是一个ole吗?QQ的应该不是。烦请分享一下:插入占位Ole的目的是做什么的啊? 测试了下,的确不需要把气泡做成ole也行,只要让气泡维护文本的开始位置和结束位置就可以了。不过我这个气泡现在还有一个bug,tab占用的宽度和它所处的位置有关系,如果一行中有tab制表符可能导致文本宽度计算错误. 可以这样:插入到richedit的时候,通过ITextRange 的GetPoint获取 范围,然后根据edit的大小,设置小缩进。应该就可以了。 例如一个右对齐的气泡,在窗口大小改变时,要重新更新缩进,可以这样:1. 将这个气泡的内容左对齐,测量出正常状态下气泡内容的宽和高。2. 然后用richedit的宽度减去气泡内容的宽度,就可以拿到缩进值了。把这个值作为新的left-indent即可需要注意的是,在readonly状态下的richedit设置indent会失败,需要对readonly 状态做下修改 例如一个右对齐的气泡,在窗口大小改变时,要重新更新缩进,可以这样:1. 将这个气泡的内容左对齐,测量出正常状态下气泡内容的宽和高。2. 然后用richedit的宽度减去气泡内容的宽度,就可以拿到缩进值了。把这个值作为新的left-indent即可需要注意的是,在readonly状态下的richedit设置indent会失败,需要对readonly 状态做下修改readonly这个问题也有发现,现在还有的问题就是setindent会回调txsetscrollpos导致部分背景计算不准确(在拖拉改变对话框宽度的时候)。还有一个问题就是由于autovscroll同样导致txsetscrollpos回调,现在把autovscroll去掉自己来接管setsel,但这样drag-drop就不好做了,我的q913182446,想要请教一下把这个东西做好 关于ie 6.0 命令按钮 [视频][9月8更新]VC入门、进阶与应用实例 EDIT控件设置字体的问题,请教 为什么我的存储过程取不到返回值啊 内容为"(0,0)-(420,297)"的CString变量长度居然是0! 菜鸟求教!!请各位大虾进来看看! 如何将一个自定义类添加到类向导中 递归和非递归 CString to int 我的分。。。。。。。。。。。。。。。给你 win7下 使用ddraw显示YUV数据,系统配色方案总会改为win7 basic 怎样去掉停靠窗口默认的右键弹出菜单
如果写一个比较完善的richedit,还是且花费不少时间呢。
这里,我不说自己如何实现。只是分析QQ气泡模式的实现方式!
曾经也以为是分两层实现的,但再想想这种方法很难做到与文字同步。
要做气泡,有两个难点:
1. 气泡背景怎么画
2. 文字如何布局画气泡背景,这里要使用一个技巧,QQ里面应该大量采用了这种方式。将Ole的大小设置为(1,1),用于占位,但在绘制的时候先将气泡画上,然后再调用m_spTextServices->TxDraw画上文字。
至于气泡的位置,在插入一段内容时要记录下这段内容的start cp、end cp,用这两个值去获取相应的坐标,计算出内容大小。文字的布局,也以为是采用右对齐,但错了。后来通过一些方法拿到qq的richedit rtf流,发现采用的就是缩进而已,通过内容大小就也可以计算也相应的左右缩进。
插入大小为(1,1)的占位ole,你的意思是,气泡是一个ole吗?
QQ的应该不是。
烦请分享一下:插入占位Ole的目的是做什么的啊?
可以这样:
插入到richedit的时候,通过ITextRange 的GetPoint获取 范围,然后根据edit的大小,设置小缩进。应该就可以了。
例如一个右对齐的气泡,在窗口大小改变时,要重新更新缩进,可以这样:
1. 将这个气泡的内容左对齐,测量出正常状态下气泡内容的宽和高。
2. 然后用richedit的宽度减去气泡内容的宽度,就可以拿到缩进值了。把这个值作为新的left-indent即可需要注意的是,在readonly状态下的richedit设置indent会失败,需要对readonly 状态做下修改
例如一个右对齐的气泡,在窗口大小改变时,要重新更新缩进,可以这样:
1. 将这个气泡的内容左对齐,测量出正常状态下气泡内容的宽和高。
2. 然后用richedit的宽度减去气泡内容的宽度,就可以拿到缩进值了。把这个值作为新的left-indent即可需要注意的是,在readonly状态下的richedit设置indent会失败,需要对readonly 状态做下修改
readonly这个问题也有发现,现在还有的问题就是setindent会回调txsetscrollpos导致部分背景计算不准确(在拖拉改变对话框宽度的时候)。还有一个问题就是由于autovscroll同样导致txsetscrollpos回调,现在把autovscroll去掉自己来接管setsel,但这样drag-drop就不好做了,我的q913182446,想要请教一下把这个东西做好