用VisualC实现图象渐显及渐隐.docxVIP

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用VisualC实现图象渐显及渐隐

用Visual C++实现图象渐显和渐隐 图象的渐显/渐隐是十分重要的图象效果,广泛运用于图象处理和多媒提娱乐 软件。渐显/渐隐算法设计的最大困难是速度控制,包括定时和快速改变图象 中各象素的颜色。如采用普通的全图扫描算法,则速度较慢,很难真正体现 渐显/渐隐效果。 利用Windows(3.x.95/98/NT)操作系统特殊的调色板管理和时间码定时机制 能设计出有效的图象渐显/渐隐算法。Windows提供一种被称为调色板动画 (palette animation)的颜色处理技术,它通过快速改变颜色调色板中所选 取的表项中的颜色能模拟颜色的变化。设置时间码,定时调用该技术使图象 颜色渐变就能实现图象的渐显和渐隐。 一、调色板动画 在Visual C++中实现调色板动画依赖于MFC类库提供的CPalette类和CDC类中 的若干成员函数,其基本步骤如下: 调用CPalette::CreatePalette(LPLOGPALETTE lpLogPalette)函数创建逻辑 调色板,注意将参数LPLOGPALETTE所指向的各颜色表项结构的peFlags域设置 为PC_RESERVED,以防止其它窗口同该调色板匹配颜色。; 调用CDC::SelectPalette和CDC::RealizePalette函数选择和实现所创建的 逻辑调色板; 调用CPalette::AnimatePalette函数改变颜色,实现调色板动画; 动画完成后应恢复系统调色板。 CPalette::AnimatePalette是其中最关键的函数,其原型如下: void AnimatePalette( UINT nStartIndex, // 起始的表项号 UINT nNumEntries, // 变化的表项数 LPPALETTEENTRY lpPaletteColors ); // 逻辑调色板表项指针 lpPaletteColors为指向PALETTEENTRY结构的指针,其中存储着逻辑调色 板将要更新的颜色信息。PALETTEENTRY结构定义如下: typedef struct tagPALETTEENTRY { // pe BYTE peRed; BYTE peGreen; BYTE peBlue; BYTE peFlags; } PALETTEENTRY; peRed、peGreen、peBlue分别表示逻辑调色板项的R、G、B颜色分量值。 peFlags 应被置为PC_RESERVED 。 nStartIndex为lpPaletteColors中将变化的起始表项号,nNumEntries 为 lpPaletteColors中将变化的表项数。 二、时间码定时 CWnd::SetTimer函数可设置一个系统时间码,并指定每经过一定的时间间隔 使Windows系统发送一个WM_TIMER消息到窗口的消息队列中。窗口在每当接收 到相应的WM_TIMER消息时做一定的处理,便实现了定时处理。 通常应在窗口的消息循环中接受和处理WM_TIMER消息,这样将很难编制通用的 定时操作。通用的定时操作应将定时处理封装在一个函数中,而不与其它的代 码纠缠在一起。笔者实现这一技术的技巧是,在循环操作中截获窗口消息,如 消息为指定的时间码消息,则进行定时处理;否则分发消息给窗口消息处理机 制。如果定时操作已结束,则修改循环标志,退出循环。具体的代码如下: ……………………………… // 设置时间码,pWnd为处理定时操作的窗口对象指针 pWnd-SetTimer(0x100, uTimeOut, NULL); // 屏蔽鼠标操作,使定时操作不受影响 pWnd-SetCapture(); // 开始定时操作 BOOL bDone = FALSE; MSG msg; 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截获窗口消息,TranslateMessage和DispatchMessage函数解释 和分发除指定时间码消息之外的所有消息,以避免丢失消息。 三

您可能关注的文档

文档评论(0)

jdy261842 + 关注
实名认证
文档贡献者

分享好文档!

1亿VIP精品文档

相关文档