双缓冲怎样解决列表控件闪烁问题.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
双缓冲怎样解决列表控件闪烁问题 雕鬃一霹瑟鬃 0tjESl10Namp;Al强 File.Create(Server.MapPath(./)+ZipFileName+ . zip)): //设置压缩等级,可以为O~9 zipFile.SetLevelf5) foreach(stringFilelDinFilelDs){ if《FitelD==~) continue; stringfileName=~: intid=int.Parse(FilelD) byte【】buffer=DownloadFileFromDatabase(id,ref fileName): ZipEntryentry=newZipEntry(fileName): zipFile.PutNextEntry(entry): zipFile.Write(buffer,0.buffer.Length): }. zipFile.Finish1): zipFileClosef): } 3.提供下载 打包压缩完成后,就可以通过使网页指向生成的文件来提 供下载,使用简单的Java脚本就可以实现. stringscript1=lt;scriptlanguage=javascriptgt;function gotoZip(){document.1ocation.href;+ZipF~eNal +.zip+:}lt;/script stringscript2=lt;scriptlanguage=javascdptgt; documentbody.onload=gotoZip;lt;/scriptgt;.,: Page.RegisterSf~rtupScriptIdownload1,script1)” Page.RegisterStartupScript《download2.script2): 执行以上语句后,客户端就会弹出IE的下载对话框,下 载打包后的Zip文件,解压后得到用户想要下载的各个文件. 通过把用户将从数据库中下载的文件动态打包,简化了用 户下载多个文件的操作步骤,减少了网络流量,实际使用在提 供Web下载的应用程序中得到了用户称赞.但当用户数量较 多,同时发出多文件下载请求时,执行效率不高,还有待解 决.’ (作者:董锐) —9双缓冲怎样解决列表控件闪烁问题 曩在MFC中,主要是在OnPaint中进行绘图,还有一 种是在OnDraw中绘图,其实OnDraw也是OnPaint调用的.当 窗口需要重绘时,系统会先用背景色擦掉当前的图形,然后再 将图形绘制上去.当背景色和窗口的颜色差别比较大,而在短 时间内这两种颜色交替出现时,闪烁就出现了.假如让系统不 用背景颜色进行擦除,那么闪烁就不会出现了.但这个时候因 为前面绘制的图形没有擦除,后来的图形又叠加上去了,画面 就会一团糟了.解决这个问题就要使用双缓冲技术.双缓冲的 基本原理就是,将图形绘制在内存中,当系统要重绘时,将内 . 存中的图形用BitBh.函数一次性输出到屏幕上,这个过程非常 的快,根本不会出现闪烁,在Windows的DirectX游戏开发包 中也是使用了类似的技术,叫做FlipSurface,不过由于DirectX 直接对硬件操作,速度更快.下面具体讲解该技术. 新建一个单文档工程,在OnEraseBkgnd(CDCpDC)函数 中,直接返回TRUE,不让系统做擦除背景的动作. 然后,在OnDraw函数中,写下面的代码 //定义一个内存DC,图形将绘制在该内存DC上 CDCmemDC: //创建一个与当前设备表兼容的l内存DC memDC.CreateCompatibleDC(pDC): CRectrect; GetClientRect(amp;rect): CBitmapBitmap,pOIdBitmap; //创建一个兼容位圈 B|tmap.CreateCompatibleBitmap(pDC,re备描述表上 pc)C一gt;BitBIt{rect.1eft,rect.toprect.Width(), rect:Height(),amp;rfiemDC,O,S—RCCOPY): memDC.SelectObject《pOIdBitmap): 删除G阱对象. Bitmap,DeleteObject《): memDC.DeleteObject《): 从上面的讨论可以看出,使用双缓冲,我们需要注意两个 问题,第一,不让系统用背景色来擦除我们的绘图表面;第 二,图形要绘制在内存DC中,然后贴到系统DC的表面. 但是还有一个关键的问题,上面是我们自己绘制的图形, 很容易使图形画在内存DC上,但是列表控件是系统绘制的. 下面我们就来解决这个问题. 首先,从MFC的CListCtrl派生一个类,假设这个类叫做 CNo

文档评论(0)

xieliandimei + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档