hur.cn - 华软网

 热门搜索

耐心的 慢慢的看下这个模仿QQ头像抖动问题

  作者:未知    来源:网络    更新时间:2011/8/26
大家好,请教一个纠结了我很久问题, 大家都知道QQ好友来了那个头像抖动功能吧, 不是托盘抖动那个好,我现在实现了      问题来了 我是用树做的, 假如现在有好友发送消息过来 , 我这边就能捕获到是那个好友发送消息来了和对应的树节点句柄  我存放到MAP 里面的  应为 我要用MAP 来循环的替换图片实现抖动效果,  我是这这样处理的 如果有用户发送消息后 我就开启一个线程 比如线程名教 IM(LPARAM) LPARAM 我就是传的 对象用户的节点句柄 然后在里面写个死循环不停的替换图片 ,   如 
 HDUTREEITEM hdu=(HDUTREEITEM)pParam;
 duWindow *duWin=theApp.GetWindowManager()->duGetWindow(g_APPFrame->m_hWnd);
 duTreeCtrl *tree=(duTreeCtrl*)duWin->GetPluginByName("treeMsg");
while(k)
{

tree->SetItemImage(hdu,"tabbutton_icon_5");
tree->Redraw();
::Sleep(500);
tree->SetItemImage(hdu,"tabbutton_icon_4");
tree->Redraw();
::Sleep(500);

}
这个可行 我做过但是这样做效率我觉得非常 非常的低, 应为树节点不能加载动态图片, 在说我这个UI 是用皮肤做的他不能加载动态图片, 所以只能这样循环做了,    这个也不考虑吧 就是考虑关闭这个线程函数 ,  比如有三个用户发送消息后   我就启用三个线程但是 他们都是 调用 IM(LPARAM)  这个函数啊  那个K 就是当我双击了 一个节点后就关闭点击那个节点的 线程 ,  现在 N 个线程都调用一个接口  我如何区分点击的是那个 我要关闭那个 ,我是不是需要把他们线程的句柄保存起来   ,不然我点击一个的时候  全部线程都关闭了 要如何区别 只关闭我点击的那个线程,!
---华软 网友回答---
不要在UI线程中Sleep,你可以用SetTimer()嘛
---华软网友回复---
我这个是自己建立的一个线程 , 不然要卡主     定时器根本不管用  假如100个用户并发性的来 我在定时器里面那样有那样多的时间处理  我如果把 定时器时间设置很长  那样抖动的时间就很慢 没用 而且 很卡 我做过了。
---华软网友回复---
引用 1 楼 visualeleven 的回复:
不要在UI线程中Sleep,你可以用SetTimer()嘛

SetTimer就可以了,不需要线程,越扯越复杂
---华软网友回复---
不应该每个动画开个线程,即使要开线程,开一个就可以了。用settimer比较好,系统忙碌的时候就放弃这个工作。
每个可能闪的项目要自己维护状态,点了以后就修改状态为不闪。线程或wm_timer消息里要判断每个item的状态,该闪的闪。

---华软网友回复---
比如我现在队列有2个用户发送了消息 我定时器 如何搞  每个消息必须要个循环来替换图片这个第二个消息根本不能相应 定时器不怎如何搞!
---华软网友回复---
哈哈!
wm_timer消息不能一直换图不返回的。要换一张就返回一次。下次进来再换。
关键你要记住,现在换到哪一张了,下次换哪张。这些信息是item(用户)相关的,要保存在item里。
---华软网友回复---
我觉得用gif动画吧
http://blog.csdn.net/stone_kingnet/article/details/3938870
---华软网友回复---
Tencent_QQBar

QQ那个地方根本不是树形结构,是QQ自己做的一个控件
---华软网友回复---
引用 5 楼 rx999 的回复:
比如我现在队列有2个用户发送了消息 我定时器 如何搞 每个消息必须要个循环来替换图片这个第二个消息根本不能相应 定时器不怎如何搞!

用定时器就不用循环来替换图片了,可以考虑在定时器的响应中有个BOOL变量。而BOOL变量的值每次根据定时器变化。比如这次为TRUE,要闪的项显示图片1,而下次响应的时候为FALS,要闪的项显示图片2,可以实现效果。
而哪些要闪哪些不闪,有个状态量,维护其状态量,这个和4楼的说得差不多。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。