图象渐显和渐隐效果的Visual C++实现方法

zhangcrony 2004-03-07 12:42:41
加精
图象的渐显/渐隐是十分重要的图象效果,广泛运用于图象处理和多媒提娱乐软件。渐显/渐隐算法设计的最大困难是速度控制,包括定时和快速改变图象中各象素的颜色。如采用普通的全图扫描算法,则速度较慢,很难真正体现渐显/渐隐效果。

利用Windows(3.x.95/98/NT)操作系统特殊的调色板管理和时间码定时机制能设计出有效的图象渐显/渐隐算法。Windows提供一种被称为调色板动画(palette animation)的颜色处理技术,它通过快速改变颜色调色板中所选取的表项中的颜色能模拟颜色的变化。设置时间码,定时调用该技术使图象颜色渐变就能实现图象的渐显和渐隐。



一、调色板动画

在Visual C++中实现调色板动画依赖于MFC类库提供的CPalette类和CDC类中的若干成员函数,其基本步骤如下:

1.调用CPalette::CreatePalette(LPLOGPALETTE lpLogPalette)函数创建逻辑调色板,注意将参数LPLOGPALETTE所指向的各颜色表项结构的peFlags域设置为PC_RESERVED,以防止其它窗口同该调色板匹配颜色。;

2.调用CDC::SelectPalette和CDC::RealizePalette函数选择和实现所创建的逻辑调色板;

3.调用CPalette::AnimatePalette函数改变颜色,实现调色板动画;

4.动画完成后应恢复系统调色板。

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函数解释和分发除指定时间码消息之外的所有消息,以避免丢失消息。
...全文
217 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧