[问题] 撰写"开启档案"功能时缩图的问题

楼主: googled (15357)   2014-04-29 21:09:10
不好意思,小弟目前再用Qt写一程式时,
因为XP系统的开启档案似乎没办法默认就是缩图模式
如图:http://ppt.cc/Nmm5
必须要从红圈处改成缩图才可以
所以必须要写一个开档功能应用在XP上 (老板坚持用XP...)
目前已经做到可以在List上显示该目录下的所有档案类型
如图:http://ppt.cc/fWTL
但对于缩图的实做上有些问题想请教
目前置作缩图的方法是将目录上的所有档案都过滤,
只显示属于图档的部分,接着去读取每一张图,然后呼叫函式缩小
最后再放到List上,但这样有一个问题是每前进一个目录
我的程式都会Delay直到该目录下所有图片都缩完并显示为止
如果图片有20张,我程式大概会有2~3秒不能动
本来想说用执行绪的方式去实作,还没缩完的图档都用系统默认的Icon
缩完一张图片在更新一个ListItem,像这个样子
http://ppt.cc/Mvpi
可是还没去实作就又想到一个问题,就是当图片过大时,
开档并缩小的时间就越长,可是看了一下Win7的缩图功能,却都是神之快
不管我图片在大,每当进入资料夹后,系统制作缩图的速度真的超迅速
而且我程式在进行缩图的过程中,程式内存会标很高,
甚至很容易出现"内存不足"的错误,
但看了一下系统管理员却还有好几G的内存可用,也满莫名其妙的
所以又感觉自己的方向不对,想请教一下各位高手,
能否给小弟一点方向、建议或提示,该怎么做才可以快速产生缩图
还是说有办法直接去读取XP、win7系统中该图片的thumbnail cache
或者XP有办法调成默认开启档案就是缩图模式ˇ_ˇ
谢谢各位
作者: LiloHuang (十年一刻)   2014-04-29 21:16:00
Windows 的缩图快取可以透过 IExtractImage 来获得这篇虽不是 C++ 的范例 http://goo.gl/N7RLlz 仍可参考至于内存不足,除了 memory leak 有些该释放没释放还有一种可能就是图片太大,难以配置到连续的内存空间至于让 XP 直接显示 thumbnail view 应该没直接的方式倒是这儿有一篇文章提到,有一些特殊技巧可以办到 :Phttp://goo.gl/lm3hnw 自己 SendMessage 给 dialog 囉SendMessage(hWnd, WM_COMMAND, ODM_VIEW_THUMBS, 0);还有如果自己 decode 会卡住,是因为 UI thread 被卡住会卡 UI 的任务,都该放到 worker thread 异步执行待任务完成之后,再通知 UI thread 更新画面之类的虽然我没有真的测试,但根据 MSDN 那篇文章的描述SendMessage 在特定情况才会成功,其他状况会失败可能要做一下 Hook 在 init dialog 时,送 PostMessage给 FileDialog 自己,然后再该时机点去改变排序的类型观察内存用量请用 procexp.exe http://goo.gl/n7utTE搭配下 debug break point 来帮助自己厘清哪些阶段增加procexp 使用时,请直接针对你的 process 点两下来观察如果可以直接改 dialog 排序达成目的当然是最快其次是 IExtractImage 这方法得懂一些 COM 操作自己 decode 图片,除非是特殊需求 (如要显示 RAW 档)不然写的好可是不简单的任务... 大概是这样 :)

Links booklink

Contact Us: admin [ a t ] ucptt.com