




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、用Visual C+实现图象渐显和渐隐 图象的渐显/渐隐是十分重要的图象效果,广泛运用于图象处理和多媒提娱乐软件。渐显/渐隐算法设计的最大困难是速度控制,包括定时和快速改变图象中各象素的颜色。如采用普通的全图扫描算法,则速度较慢,很难真正体现渐显/渐隐效果。利用Windows(3.x.95/98/NT)操作系统特殊的调色板管理和时间码定时机制能设计出有效的图象渐显/渐隐算法。Windows提供一种被称为调色板动画(palette animation)的颜色处理技术,它通过快速改变颜色调色板中所选取的表项中的颜色能模拟颜色的变化。设置时间码,定时调用该技术使图象颜色渐变就能实现图象的渐显和渐隐。
2、一、调色板动画在Visual C+中实现调色板动画依赖于MFC类库提供的CPalette类和CDC类中的若干成员函数,其基本步骤如下:调用CPalette:CreatePalette(LPLOGPALETTE lpLogPalette)函数创建逻辑调色板,注意将参数LPLOGPALETTE所指向的各颜色表项结构的peFlags域设置为PC_RESERVED,以防止其它窗口同该调色板匹配颜色。;调用CDC:SelectPalette和CDC:RealizePalette函数选择和实现所创建的逻辑调色板;调用CPalette:AnimatePalette函数改变颜色,实现调色板动画;动画完成后应恢
3、复系统调色板。CPalette:AnimatePalette是其中最关键的函数,其原型如下:void AnimatePalette(UINT nStartIndex, / 起始的表项号UINT nNumEntries, / 变化的表项数LPPALETTEENTRY lpPaletteColors ); / 逻辑调色板表项指针lpPaletteColors为指向PALETTEENTRY结构的指针,其中存储着逻辑调色板将要更新的颜色信息。PALETTEENTRY结构定义如下:typedef struct tagPALETTEENTRY / peBYTE peRed;BYTE peGreen;BYT
4、E peBlue;BYTE peFlags; PALETTEENTRY;peRed、peGreen、peBlue分别表示逻辑调色板项的R、G、B颜色分量值。peFlags 应被置为PC_RESERVED 。nStartIndex为lpPaletteColors中将变化的起始表项号,nNumEntries 为lpPaletteColors中将变化的表项数。二、时间码定时CWnd:SetTimer函数可设置一个系统时间码,并指定每经过一定的时间间隔使Windows系统发送一个WM_TIMER消息到窗口的消息队列中。窗口在每当接收到相应的WM_TIMER消息时做一定的处理,便实现了定时处理。通常应在
5、窗口的消息循环中接受和处理WM_TIMER消息,这样将很难编制通用的定时操作。通用的定时操作应将定时处理封装在一个函数中,而不与其它的代码纠缠在一起。笔者实现这一技术的技巧是,在循环操作中截获窗口消息,如消息为指定的时间码消息,则进行定时处理;否则分发消息给窗口消息处理机制。如果定时操作已结束,则修改循环标志,退出循环。具体的代码如下:/ 设置时间码,pWnd为处理定时操作的窗口对象指针pWnd-SetTimer(0x100, uTimeOut, NULL);/ 屏蔽鼠标操作,使定时操作不受影响pWnd-SetCapture();/ 开始定时操作BOOL bDone = FALSE;MSG m
6、sg;while (! bDone)if (:PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)if (msg.message = WM_TIMER & msg. WParam = 0x100).定时操作代码./ 如定时操作完成,则设置循环标志,结束操作if (定时操作完成)bDone = TRUE;:TranslateMessage(&msg);:DispatchMessage(&msg);/ 释放鼠标:ReleaseCapture();/ 删除时间码pWnd-KillTimer(0x100);.函数PeekMessage截获窗口消息,TranslateMess
7、age和DispatchMessage函数解释和分发除指定时间码消息之外的所有消息,以避免丢失消息。三、渐显渐显就是将显示颜色由黑色(RGB(0, 0, 0))逐渐变化为图象各象素的颜色的过程。开始时调用CPalette:GetPaletteEntries函数保存图象调色板的各逻辑表项信息,然后调用CPalette:SetPaletteEntries函数将逻辑调色板中各逻辑表项的peRed、peGreen、peBlue置为0,定时调用CPalette:AnimatePalette,每次将各逻辑表项的peRed、peGreen、peBlue值增加一个变化量,直到它们分别等于图象逻辑调色板中各逻辑
8、表项的peRed、peGreen、peBlue值。下面的函数FadeIn通过对调色板颜色表项中的各颜色分量值先设为0,然后进行递增,直到所有颜色值都恢复成原调色板中颜色值来实现渐显。/ 图象渐显效果/ 参数:/ pWnd - 显示图象的窗口/ pPal - 调色板指针/ nDeta - 各颜色分量的减小量/ uTimeOut - 时间的变化量void FadeIn(CWnd *pWnd, CPalette *pPal, int nDeta, UINT uTimeOut)/ 保留原来的调色板颜色表项int nTotalColors = pPal-GetEntryCount();PALETTEEN
9、TRY PaletteColors0256;pPal-GetPaletteEntries(0, nTotalColors, PaletteColors0);/ 先将调色板表项中各颜色分量置为0PALETTEENTRY PaletteColors1256;for (int i=0; iSetPaletteEntries(0, nTotalColors, PaletteColors1);pPal-AnimatePalette(0, nTotalColors, PaletteColors1);/ 设置时间码pWnd-SetTimer(0x100, uTimeOut, NULL);/ 开始渐显pWnd
10、-SetCapture();BOOL bDone = FALSE;MSG msg;while (! bDone)if (:PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)if (msg.message = WM_TIMER & msg.wParam = 0x100)CClientDC dc(pWnd);CPalette *pOldPal = dc.SelectPalette(pPal, FALSE);dc.RealizePalette();/ 递增各颜色分量PALETTEENTRY PaletteColors256;pPal-GetPaletteEntries(
11、0, nTotalColors, PaletteColors);BOOL bRedZero=FALSE;BOOL bGreenZero=FALSE;BOOL bBlueZero=FALSE;for (int i=0; inTotalColors; +i)if (PaletteColorsi.peRed + nDeta PaletteColors0i.peRed)PaletteColorsi.peRed += nDeta;bRedZero = FALSE;else if (PaletteColorsi.peRed + 1 PaletteColors0i.peRed)PaletteColorsi.
12、peRed+;bRedZero = FALSE;elsebRedZero = TRUE;if (PaletteColorsi.peGreen + nDeta PaletteColors0i.peGreen)PaletteColorsi.peGreen += nDeta;bGreenZero = FALSE;else if (PaletteColorsi.peGreen + 1 PaletteColors0i.peGreen)PaletteColorsi.peGreen+;bGreenZero = FALSE;elsebGreenZero = TRUE;if (PaletteColorsi.pe
13、Blue + nDeta PaletteColors0i.peBlue)PaletteColorsi.peBlue += nDeta;bBlueZero = FALSE;else if (PaletteColorsi.peBlue +1 AnimatePalette(0, nTotalColors, PaletteColors);:TranslateMessage(&msg);:DispatchMessage(&msg);:ReleaseCapture();pWnd-KillTimer(0x100);/ 恢复原始调色板pPal-SetPaletteEntries(0, nTotalColors
14、, PaletteColors0);pPal-AnimatePalette(0, nTotalColors, PaletteColors0);四、渐隐渐隐就是将显示颜色由图象各象素的颜色逐渐变化为黑色(RGB(0, 0, 0))的过程,即定时调用CPalette:AnimatePalette,每次将各逻辑表项的peRed、peGreen、peBlue值减小一个变化量,直到它们都为0。下面的函数FadeOut通过对调色板颜色表项中的各颜色分量值进行递减,直到所有颜色值都变成0(即黑色)来实现渐隐。/ 图象渐隐效果/ 参数:/ pWnd - 显示图象的窗口/ pPal - 调色板指针/ nDeta
15、 - 各颜色分量的减小量/ uTimeOut - 时间的变化量void FadeOut(CWnd *pWnd, CPalette *pPal, int nDeta, UINT uTimeOut)/ 保留原来的调色板颜色表项int nTotalColors = pPal-GetEntryCount();PALETTEENTRY PaletteColors0256;pPal-GetPaletteEntries(0, nTotalColors, PaletteColors0);/ 设置时间码pWnd-SetTimer(0x100, uTimeOut, NULL);/ 开始渐隐pWnd-SetCapt
16、ure();BOOL bDone = FALSE;MSG msg;while (! bDone)if (:PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)if (msg.message = WM_TIMER & msg.wParam = 0x100)CClientDC dc(pWnd);CPalette *pOldPal = dc.SelectPalette(pPal, FALSE);dc.RealizePalette();PALETTEENTRY PaletteColors256;pPal-GetPaletteEntries(0, nTotalColors,
17、PaletteColors);BOOL bRedZero=FALSE;BOOL bGreenZero=FALSE;BOOL bBlueZero=FALSE;/ 递减颜色分量for (int i=0; i nDeta)PaletteColorsi.peRed -= nDeta;bRedZero = FALSE;else if (PaletteColorsi.peRed 1)PaletteColorsi.peRed-;bRedZero = FALSE;elsebRedZero = TRUE;if (PaletteColorsi.peGreen nDeta)PaletteColorsi.peGree
18、n -= nDeta;bGreenZero = FALSE;else if (PaletteColorsi.peGreen 1)PaletteColorsi.peGreen-;bGreenZero = FALSE;elsebGreenZero = TRUE;if (PaletteColorsi.peBlue nDeta)PaletteColorsi.peBlue -= nDeta;bBlueZero = FALSE;else if (PaletteColorsi.peBlue 1)PaletteColorsi.peBlue-;bBlueZero = FALSE;elsebBlueZero = TRUE;/ 如所有颜色分量都为0,则结束渐隐bDone = bRedZero & bGre
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版拆迁房屋买卖合同范本
- 2025年事业单位工勤技能-河北-河北地质勘查员五级(初级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-河北-河北保健按摩师五级(初级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江西-江西政务服务办事员四级(中级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江西-江西保健按摩师一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江苏-江苏无损探伤工五级(初级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西铸造工二级(技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广西-广西有线广播电视机务员四级(中级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广西-广西垃圾清扫与处理工四级(中级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广西-广西下水道养护工四级(中级工)历年参考题库含答案解析
- 反应釜操作知识培训课件
- 2025年一级建造师《建筑工程管理与实务》试卷真题(附解析)
- 物业薪酬管理办法
- 外场管理制度
- 集团公司新闻宣传工作管理办法
- 物业消防安全管理制度
- 无线电监测技术设施运行维护项目需求
- NSA2000变频器使用说明书
- 动物生理学电子教案
- 2025年电梯修理T证试题(附答案)
- 学校开荒保洁服务方案
评论
0/150
提交评论