惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - 迷失天堂

映射模式 vc++入门宝典 关于:error LNK2001:unresolved external symbol F11可以切换浏览器状态 const用法 Spy++的用途 Windows 取得程序运行的路径 VC界面开发,我的一些小知识点 inline函数 在VC中启动另外一个程序(.exe、...)方法 二值图像跟踪曲线程序 在MFC程序中使用VC Components visual c++键盘快捷键大全 在VC中实现扩展广告条 马骏 解决Windows 程序界面闪烁问题的一些经验 OpenGL FAQ CString 操作指南 新的Win32控件(转自:http://www.lzu.edu.cn/netteach/jiaochen/vc++5.0/vc++5.0/chap6/chap6_2.htm) 好用的快捷键推广
图象的渐显/渐隐
迷失天堂 · 2005-06-02 · via 博客园 - 迷失天堂

图象的渐显/渐隐

图象的渐显/渐隐是十分重要的图象效果,广泛运用于图象处理和多媒提娱乐软件。渐显/渐隐算法设计的最大困难是速度控制,包括定时和快速改变图象中各象素的颜色。如采用普通的全图扫描算法,则速度较慢,很难真正体现渐显/渐隐效果。  
 
利用操作系统特殊的调色板管理和时间码定时机制能设计出有效的图象渐显/渐隐算法。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函数解释和分发除指定时间码消息之外的所有消息,以避免丢失消息。

posted on 2005-06-02 21:06  迷失天堂  阅读(2125)  评论()    收藏  举报