欢迎来到天天文库
浏览记录
ID:19847697
大小:50.00 KB
页数:19页
时间:2018-10-06
《用visual c++实现图象渐显与渐隐》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用VisualC++实现图象渐显和渐隐用VisualC++实现图象渐显和渐隐摘要图象的渐显/渐隐被广泛运用与图象处理和多媒提娱乐软件。本文基于Windows的调色板动画和时间码技术设计了通用的图象渐显和渐隐算法,并实现了其VisualC++程序编码。关键词渐显、渐隐、调色板、调色板动画、时间码图象的渐显/渐隐是十分重要的图象效果,广泛运用于图象处理和多媒提娱乐软件。渐显/渐隐算法设计的最大困难是速度控制,包括定时和快速改变图象中各象素的颜色。如采用普通的全图扫描算法,则速度较慢,很难真正体现渐显/渐隐
2、效果。利用Windows(3.x.95/98/NT)操作系统特殊的调色板管理和时间码定时机制能设计出有效的图象渐显/渐隐算法。Windows提供一种被称为调色板动画(paletteanimation)的颜色处理技术,它通过快速改变颜色调色板中所选取的表项中的颜色能模拟颜色的变化。设置时间码,定时调用该技术使图象颜色渐变就能实现图象的渐显和渐隐。一、调色板动画在VisualC++中实现调色板动画依赖于MFC类库提供的CPalette类和CDC类中的若干成员函数,其基本步骤如下:1.调用CPalette:
3、:CreatePalette(LPLOGPALETTElpLogPalette)函数创建逻辑调色板,注意将参数LPLOGPALETTE所指向的各颜色表项结构的peFlags域设置为PC_RESERVED,以防止其它窗口同该调色板匹配颜色。;2.调用CDC::SelectPalette和CDC::RealizePalette函数选择和实现所创建的逻辑调色板;3.调用CPalette::AnimatePalette函数改变颜色,实现调色板动画;4.动画完成后应恢复系统调色板。CPalette::Anima
4、tePalette是其中最关键的函数,其原型如下:voidAnimatePalette(UINTnStartIndex,//起始的表项号UINTnNumEntries,//变化的表项数LPPALETTEENTRYlpPaletteColors);//逻辑调色板表项指针lpPaletteColors为指向PALETTEENTRY结构的指针,其中存储着逻辑调色板将要更新的颜色信息。PALETTEENTRY结构定义如下:typedefstructtagPALETTEENTRY{//peBYTEpeRed;B
5、YTEpeGreen;BYTEpeBlue;BYTEpeFlags;}PALETTEENTRY;peRed、peGreen、peBlue分别表示逻辑调色板项的R、G、B颜色分量值。peFlags应被置为PC_RESERVED。nStartIndex为lpPaletteColors中将变化的起始表项号,nNumEntries为lpPaletteColors中将变化的表项数。二、时间码定时CWnd::SetTimer函数可设置一个系统时间码,并指定每经过一定的时间间隔使Windows系统发送一个WM_TI
6、MER消息到窗口的消息队列中。窗口在每当接收到相应的WM_TIMER消息时做一定的处理,便实现了定时处理。通常应在窗口的消息循环中接受和处理WM_TIMER消息,这样将很难编制通用的定时操作。通用的定时操作应将定时处理封装在一个函数中,而不与其它的代码纠缠在一起。笔者实现这一技术的技巧是,在循环操作中截获窗口消息,如消息为指定的时间码消息,则进行定时处理;否则分发消息给窗口消息处理机制。如果定时操作已结束,则修改循环标志,退出循环。具体的代码如下:………………………………//设置时间码,pWnd为处理
7、定时操作的窗口对象指针pWnd->SetTimer(0x100,uTimeOut,NULL);//屏蔽鼠标操作,使定时操作不受影响pWnd->SetCapture();//开始定时操作BOOLbDone=FALSE;MSGmsg;while(!bDone){if(::PeekMessage(&msg,NULL,0,0,PM_REMOVE)){if(msg.message==WM_TIMER&&msg.WParam==0x100){…………………..定时操作代码…………………..//如定时操作完成,则设
8、置循环标志,结束操作if(定时操作完成)bDone=TRUE;}::TranslateMessage(&msg);::DispatchMessage(&msg);}}//释放鼠标::ReleaseCapture();//删除时间码pWnd->KillTimer(0x100);…………………………..函数PeekMessage截获窗口消息,TranslateMessage和DispatchMessage函数解释和分发除指定时间码消息之外的所有消息,以避免丢
此文档下载收益归作者所有