用VC 实现图象渐显和渐隐

渐隐渐显地显示图像(vc6.0图象处理技术) 渐隐渐显地显示图像,vc6.0图象处理技术,原代码,能运行 立即下载
作者: 周长发

摘 要 图象的渐显/渐隐被广泛运用与图象处理和多媒提娱乐软件。本文基于Windows的调色板动画和时间码技术设计了通用的图象渐显和渐隐算法,并实现了其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函数解释和分发除指定时间码消息之外的所有消息,以避免丢失消息。

三、渐显

渐显就是将显示颜色由黑色(RGB(0, 0, 0))逐渐变化为图象各象素的颜色的过程。开始时调用CPalette::GetPaletteEntries函数保存图象调色板的各逻辑表项信息,然后调用CPalette::SetPaletteEntries函数将逻辑调色板中各逻辑表项的peRed、peGreen、peBlue置为0,定时调用CPalette::AnimatePalette,每次将各逻辑表项的peRed、peGreen、peBlue值增加一个变化量,直到它们分别等于图象逻辑调色板中各逻辑表项的peRed、peGreen、peBlue值。

下面的函数FadeIn通过对调色板颜色表项中的各颜色分量值先设为0,然后进行递增,直到所有颜色值都恢复成原调色板中颜色值来实现渐显。

// 图象渐显效果

// 参数:

// pWnd – 显示图象的窗口

// pPal – 调色板指针

// nDeta – 各颜色分量的减小量

// uTimeOut – 时间的变化量

void FadeIn(CWnd *pWnd, CPalette *pPal, int nDeta, UINT uTimeOut)

{

// 保留原来的调色板颜色表项

int nTotalColors = pPal->GetEntryCount();

PALETTEENTRY PaletteColors0[256];

pPal->GetPaletteEntries(0, nTotalColors, PaletteColors0);

// 先将调色板表项中各颜色分量置为0

PALETTEENTRY PaletteColors1[256];

for (int i=0; i<nTotalColors; ++i)

{

PaletteColors1[i].peRed = 0;

PaletteColors1[i].peGreen = 0;

PaletteColors1[i].peBlue = 0;

PaletteColors1[i].peFlags = PC_RESERVED;

}

pPal->SetPaletteEntries(0, nTotalColors, PaletteColors1);

pPal->AnimatePalette(0, nTotalColors, PaletteColors1);

// 设置时间码

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)

{

CClientDC dc(pWnd);

CPalette *pOldPal = dc.SelectPalette(pPal, FALSE);

dc.RealizePalette();

// 递增各颜色分量

PALETTEENTRY PaletteColors[256];

pPal->GetPaletteEntries(0, nTotalColors, PaletteColors);

BOOL bRedZero=FALSE;

BOOL bGreenZero=FALSE;

BOOL bBlueZero=FALSE;

for (int i=0; i<nTotalColors; ++i)

{

if (PaletteColors[i].peRed + nDeta <

PaletteColors0[i].peRed)

{

PaletteColors[i].peRed += nDeta;

bRedZero = FALSE;

}

else if (PaletteColors[i].peRed + 1 <

PaletteColors0[i].peRed)

{

PaletteColors[i].peRed++;

bRedZero = FALSE;

}

else

bRedZero = TRUE;

if (PaletteColors[i].peGreen + nDeta <

PaletteColors0[i].peGreen)

{

PaletteColors[i].peGreen += nDeta;

bGreenZero = FALSE;

}

else if (PaletteColors[i].peGreen + 1 <

PaletteColors0[i].peGreen)

{

PaletteColors[i].peGreen++;

bGreenZero = FALSE;

}

else

bGreenZero = TRUE;

if (PaletteColors[i].peBlue + nDeta <

PaletteColors0[i].peBlue)

{

PaletteColors[i].peBlue += nDeta;

bBlueZero = FALSE;

}

else if (PaletteColors[i].peBlue +1 <

PaletteColors0[i].peBlue)

{

PaletteColors[i].peBlue++;

bBlueZero = FALSE;

}

else

bBlueZero = TRUE;

}

// 直到恢复原始值结束

bDone = bRedZero && bGreenZero && bBlueZero;

// 使系统改变调色板

pPal->AnimatePalette(0, nTotalColors, PaletteColors);

}

::TranslateMessage(&msg);

::DispatchMessage(&msg);

}

}

::ReleaseCapture();

pWnd->KillTimer(0x100);

// 恢复原始调色板

pPal->SetPaletteEntries(0, nTotalColors, PaletteColors0);

pPal->AnimatePalette(0, nTotalColors, PaletteColors0);

}

四、渐隐

渐隐就是将显示颜色由图象各象素的颜色逐渐变化为黑色(RGB(0, 0, 0))的过程,即定时调用CPalette::AnimatePalette,每次将各逻辑表项的peRed、peGreen、peBlue值减小一个变化量,直到它们都为0。

下面的函数FadeOut通过对调色板颜色表项中的各颜色分量值进行递减,直到所有颜色值都变成0(即黑色)来实现渐隐。

// 图象渐隐效果

// 参数:

// pWnd – 显示图象的窗口

// pPal – 调色板指针

// nDeta – 各颜色分量的减小量

// uTimeOut – 时间的变化量

void FadeOut(CWnd *pWnd, CPalette *pPal, int nDeta, UINT uTimeOut)

{

// 保留原来的调色板颜色表项

int nTotalColors = pPal->GetEntryCount();

PALETTEENTRY PaletteColors0[256];

pPal->GetPaletteEntries(0, nTotalColors, PaletteColors0);

// 设置时间码

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)

{

CClientDC dc(pWnd);

CPalette *pOldPal = dc.SelectPalette(pPal, FALSE);

dc.RealizePalette();

PALETTEENTRY PaletteColors[256];

pPal->GetPaletteEntries(0, nTotalColors, PaletteColors);

BOOL bRedZero=FALSE;

BOOL bGreenZero=FALSE;

BOOL bBlueZero=FALSE;

// 递减颜色分量

for (int i=0; i<nTotalColors; ++i)

{

if (PaletteColors[i].peRed > nDeta)

{

PaletteColors[i].peRed -= nDeta;

bRedZero = FALSE;

}

else if (PaletteColors[i].peRed > 1)

{

PaletteColors[i].peRed--;

bRedZero = FALSE;

}

else

bRedZero = TRUE;

if (PaletteColors[i].peGreen > nDeta)

{

PaletteColors[i].peGreen -= nDeta;

bGreenZero = FALSE;

}

else if (PaletteColors[i].peGreen > 1)

{

PaletteColors[i].peGreen--;

bGreenZero = FALSE;

}

else

bGreenZero = TRUE;

if (PaletteColors[i].peBlue > nDeta)

{

PaletteColors[i].peBlue -= nDeta;

bBlueZero = FALSE;

}

else if (PaletteColors[i].peBlue > 1)

{

PaletteColors[i].peBlue--;

bBlueZero = FALSE;

}

else

bBlueZero = TRUE;

}

// 如所有颜色分量都为0,则结束渐隐

bDone = bRedZero && bGreenZero && bBlueZero;

// 使系统改变调色板

pPal->AnimatePalette(0, nTotalColors, PaletteColors);

}

::TranslateMessage(&msg);

::DispatchMessage(&msg);

}

}

::ReleaseCapture();

pWnd->KillTimer(0x100);

// 恢复原始调色板

pPal->SetPaletteEntries(0, nTotalColors, PaletteColors0);

pPal->AnimatePalette(0, nTotalColors, PaletteColors0);

}

C++ 源码 窗口渐隐 C++ 源码 窗口渐隐 C++ 源码 窗口渐隐 C++ 源码 窗口渐隐 C++ 源码 窗口渐隐 C++ 源码 窗口渐隐 立即下载

相关推荐

vc窗口的渐显渐隐效果

此示例程序采用VC6.0开发平台,演示了窗口逐渐显示逐渐消失的动画效果.

VC++颜色渐变实现的3种方法

要实现窗口(如菜单、按钮、主背景等)背景颜色的多样化,有很多种实现方法,其中颜色渐变就是一种比较常见的方法。它简单实用,即改变了窗口背景颜色的单调,又实现简单。主要方法有很多种,各有各的算法和特点。我在此给大家介绍3种比较简单的方法,且是2种颜色之间的渐变。 1.自绘法:2.使用windows的提供的一个API函数3.直接加载外部图片4.GDI+ 函数 本文提供了以上3种渐变方法的测试工程,检验证均能满足要求。 工程源码下载地址:http://download.youkuaiyun.com/source/2836

mycaibo编程 9983

窗口渐显渐隐效果MASM32演示程序

用MASM32编写,演示使用AnimateWindow函数实现窗口窗口渐显渐隐效果

VC++界面编程之--阴影窗口的实现详解

对于我们这些控件狂来说,窗口阴影也是一个必不可少的实现需求。虽说其没多大用,但对于增加窗口立体感来说,那是挺有帮助的。 我实现了一个类似于360界面的阴影效果,其可以支持正常窗口,也支持半透明窗口。 阴影窗口对于正常窗口和半透明窗口,有区别么?且让我慢慢写来:) 阴影窗口的实现原理,简单来讲:就是在主窗口创建时,创建一个子窗口,吸附于主窗口的底部。然后在子窗口上做一个带半透明阴影效果的描

renstarone的博客 9578

vc实现图像的渐隐渐显

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

visual c++实现图像渐变.zip

vc实现图像渐变.zip

Visual C++中的图形特技

随着计算机信息表示及实现的多媒体化,在许多学习软件、游戏软件,以及多媒体课件制作软件中,经常使用各种图形显示技巧,如图形的推拉、交错、雨滴状、百页窗、积木随机堆叠等显示模式。这样使画面变得更为生动活泼,更能吸引用户,也为更好地发挥软件的功能奠定了基础。本文就Visual C++ 6.0中实现图形的各种显示技巧的原理及具体方法做些探讨。 基本原理 在Visual C++6.0中,显示位图的方法及过程

好色天使的专栏 1150

FOC电机控制中电流采样延迟补偿的原理和方法

摘要: FOC电机控制中,电流采样、计算与PWM更新存在固有延迟(约1.5个PWM周期),导致相位滞后,限制电流环带宽。主流补偿方法包括: 一阶前向预测法:基于历史电流值预测未来电流,抵消延迟,工程应用广泛; 相位超前补偿:通过s/z域校正器设计实现等效预测; 状态观测器法(如龙伯格观测器):通过电机模型闭环估计状态,兼具噪声抑制和参数辨识能力,但复杂度高。实际需注意参数敏感性、离散化精度及延迟时间校准,避免过补偿风险。一阶预测法因平衡效果与复杂度成为工业首选。

jifengzhiling的博客 2232

Visual Studio 2013 class颜色问题

the only solution that worked for me was to first close VS2013 and then delete the following registry key: HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\FontAndColors After reopening VS20

acns的专栏 1530

基于Matlab与Bladed联合仿真的交互软件设计

基于Matlab与Bladed的交互软件设计

weixin_45014222的博客 815

二阶FLL辅助三阶PLL环路的代码解读

今天对GNSS接收机里面的载波跟踪环路代码进行了解读 以下是个人的一点见解 % 载波环第二步:环路滤波器 二阶FLL辅助三阶PLL环路 carrLoopS0 = lastCarrLoopS0 + (phaseErr*tau0PLL + freqErr*tau1FLL) * PDIcarr; carrLoopS1 = lastCarrLoopS1 + (tau1PLL*phaseErr + carrLoopS0 + tau2FLL*freqErr) * PD

LWN7321的博客 2629

用VC实现图象渐显和渐隐

摘 要 图象的渐显/渐隐被广泛运用与图象处理和多媒提娱乐软件。本文基于windows的调色板动画和时间码技术设计了通用的图象渐显和渐隐算法,并实现了其visual c++程序编码。关键词 渐显、渐隐、调色板、调色板动画、时间码图象的渐显/渐隐是十分重要的图象效果,广泛运用于图象处理和多媒提娱乐软件。渐显/渐隐算法设计的最大困难是速度控制,包括定时和快速改变图象中各象素的颜色。如采用普通的全

漫步云端的专栏 648

VS Code + Codex 在 WSL 中使用的正确姿势

Codex 登录只能在本地完成。文件仍可通过 UNC 路径访问 WSL → 本地 Codex 就能照常工作。避免在 WSL 内重复安装/登录 Codex 扩展。

yangguangwuyue的博客 9829

用VC 实现图象渐显和渐隐 (转)

用VC 实现图象渐显和渐隐 (转)[@more@]作者: 周长发摘 要 图象的渐显/渐隐被广泛运用与图象处理和多媒提娱乐软件。本文基于windows的调色板动画和时间码技术设计了通用的图象渐显和渐隐算法,并实现了其Visual ...

csd3176的博客 103

arcgis计算栅格平均值

打开FC栅格数据和非水体矢量数据 利用矢量数据提取对应栅格的非水体部分 2.1打开空间分析工具à提取分析à按掩膜提取 输入对应栅格数据和矢量数据 2.2提取结果如下 进行计算FC平均值 3.1打开空间分析工具à多元分析à波段集统计 输入对应栅格和输出路径 3.2统计结果如下 ...

Z_W_H_的博客 5371

UDS19 03 和19 04服务--答疑

UDS 1903服务(reportDTCSnapshotIdentification)用于获取ECU中存储的故障码快照标识信息。该服务返回DTC编号及对应的快照记录编号,为后续使用1904服务读取详细快照数据提供依据。请求报文为"1903",响应报文格式为"5903"后接DTC编号和记录编号列表。该服务需在非默认会话模式下执行,且清除诊断信息会删除相关快照记录。1903服务是读取DTC快照数据的基础步骤,可帮助确定ECU中存储的故障快照情况。

汽车软件开发 454

窗口对话框渐显

xiao69的专栏 971

用C#+Avalonia写跨平台串口工具:Windows/macOS/Linux通吃,还能解析Modbus+画实时曲线

不管是串口还是蓝牙,核心操作都是“打开连接、发数据、收数据、关连接”,先定义一个// 通信设备接口:统一串口/蓝牙的操作// 连接状态变化事件(UI层订阅)// 接收数据事件(收到数据后触发)// 通信配置(不同设备配置不同,用泛型)// 通信设备接口:统一串口/蓝牙的操作 public interface ICommDevice : IDisposable {// 连接状态变化事件(UI层订阅) event Action < bool > OnConnectionChanged;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 997

---===浅谈位图的淡入淡出和渐隐===---

 浅谈位图的淡入淡出和渐隐成都电子科技大学 朱宁 在许多游戏和屏幕保护程序中,我们都可以发现位图的淡入淡出和渐隐(一幅图象渐渐的消失于另一幅图象中)的应用。如何实现这些效果呢?在windows(GDI)环境下,实现位图的淡入淡出和渐隐的方法有三种:1.调色板动画;2.模式画刷;3.动画法。其中,第一种方法速度很快,但只能用于256色的图形,而且不易实现渐隐效果。第二种方法实现比较简单,但是主观效果

软件开发资料汇总 343

YOLOv11改进 | 模型知识蒸馏篇 | 利用模型蒸馏改进YOLOv11进行无损涨点 | 离线蒸馏(附代码 + 完整文件 + 解析教程)

这篇文章给大家带来的最新改进是模型的蒸馏,利用教师模型指导学生模型从而进行模型的涨点,本文的内容不仅可以用于论文中,在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术,所以大家可以仔细学习一下本文的内容,本文从YOLOv8的项目文件为例,进行详细的修改教程,文章内包括完整的修改教程,针对小白我出了视频修改教程,如果你还不会我提供了修改后的文件大家直接运行即可,所以说不用担心不会适用!模型蒸馏真正的无损涨点,蒸馏你只看这一篇文章就足够了!欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 4322

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

(转)VC++图象处理编程(二)

BMP图像显示的特效操作 在上面的学习基础上,我们可以进一步深化,学习并掌握图像特效显示技术。有了这种技术,可以用来在今后的项目开发中美化我们的软件界面,提高软件的视觉效果。在如今的商业软件中,几乎每一幅图像的显示都采用了图像特效显示,例如读者比较熟悉的Windows的屏幕保护程序就采用了各种各样的图像特效显示,使人感到眼花缭乱和耳目一新。专业图像处理软件更是提供了丰富的显示方式供用户使用,

gxj1680的专栏 925

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC++图象处理编程(二)

BMP图像显示的特效操作在上面的学习基础上,我们可以进一步深化,学习并掌握图像特效显示技术。有了这种技术,可以用来在今后的项目开发中美化我们的软件界面,提高软件的视觉效果。在如今的商业软件中,几乎每一幅图像的显示都采用了图像特效显示,例如读者比较熟悉的Windows的屏幕保护程序就采用了各种各样的图像特效显示,使人感到眼花缭乱和耳目一新。专业图像处理软件更是提供了丰富的显示方式供用户使用,

278

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VC数字图像处理编程讲座之四--BMP图像显示的特效操作

在如今的商业软件中,几乎每一幅图像的显示都采用了图像特效显示,例如读者比较熟悉的Windows的屏幕保护程序就采用了各种各样的图像特效显示,使人感到眼花缭乱和耳目一新。专业图像处理软件更是提供了丰富的显示方式供用户使用,可以方便的在程序中实现图像的特效显示,如PhotoShop 、Authorware等。本节主要介绍如何实现图像的浮雕、雕刻、百页窗、旋转、扫描、栅条、马赛克、和渐显渐隐显示等效果。

yiyaoyao58958的专栏 5208

VC数字图像处理编程讲座之四

本文章地址:http://tech.163.com/05/1101/17/21G64SVD0009159F.html    [导读]在这一讲中作者进一步深入讲解了图像特效的显示技术......BMP图像显示的特效操作  上期讲座中我们主要讲述了BMP图像数据的存取、图像的显示和调色板的操作等内容,在上面的学习基础上,我们可以进一步深化,学习并掌握图像特效显示技术。有了这种技术,可以用来在今

loswdarmy的专栏 784
上一篇: VC的拨号上网程序
下一篇: 玩的就是“心”跳 - Athlon超频手记
silver
博客等级 码龄26年 128粉丝 2072原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值