网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
浅谈位图的淡入淡出和渐隐
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式

成都电子科技大学   朱宁

在许多游戏和屏幕保护程序中,我们都可以发现位图的淡入淡出和渐隐(一幅图象渐渐的消失于另一幅图象中)的应用。如何实现这些效果呢?

在windows(GDI)环境下,实现位图的淡入淡出和渐隐的方法有三种:1.调色板动画;2.模式画刷;3.动画法。其中,第一种方法速度很快,但只能用于256色的图形,而且不易实现渐隐效果。第二种方法实现比较简单,但是主观效果不及其余两种。第三种方法的效果很好,但速度要稍慢一些。由于现在已经很难得到质量较高的256色图片,加之目前几乎所有的显卡均支持高彩和真彩模式,所以不推荐采用第一种方法。下面介绍后两种方法在Visual C++编程环境下的实现。



一:模式画刷法:

CDC类的BitBlt(),MaskBlt(),以及WIN32API ::StretchDIBits()函数均支持三元ROP(Raster Operation)操作,即由源,模式画刷(pattern brush)和目的区域原有的图形经一定的逻辑运算而形成最终的输出图形。所以,通过改变模式画刷的图案,辅以一定的ROP操作,就可以形成一些特殊的效果。

首先,要准备若干个8*8的单色位图,作为模式画刷的模板。单色位图中应只含有黑白两种颜色的像素,每一个位图中两种像素的比例和形状将决定显示的效果,通常我们由一个全黑的位图开始,逐渐增加白色像素的比例,最后一幅位图全部由白色象素组成。

这些位图制作好以后,将它们Import入工程,命名为IDB_PATTERN1、IDB_PATTERN2 调用CBitmap::LoadBitmap()函数将其选入对应的CBitmap对象,然后调用CBrush::CreatePatternBrush()制作模式画刷。

有了合适的模式画刷以后,还需要设定我们所需的ROP码,对于淡入操作,要求将源位图与模式画刷的反依次相与。对于淡出操作,要求将当前显示区域的位图与模式画刷依次相与。对于渐隐,我们需要把原位图与模式画刷相与后,把这个结果和当前显示区域的位图和画刷的镜象(原画刷的非)相与的结果相或。依次改变画刷,就可以得到渐隐的效果。这些操作的ROP码,MFC中并没有对应的预定义宏,但我们可以通过计算得到它,在Visual C++ 5.0 的在线文档“Ternary Raster Operations”中,详细介绍了计算方法。最终我们得到淡入、淡出操作的ROP码分别为000C0324、0x00A000C9。渐隐操作的ROP码是0x00AC0744。为了形成完整的动画效果,我们需要设置一个定时器来自动的执行这一系列的操作。

下面用一个简单的例子说明模式画刷法的实现:



1:建立一个基于对话框的项目,命名为PatternDemo.

2:删除对话框上的“Todo:”注释,并增加一个按纽,命名为“DEMO”

3:为DEMO按纽加入对应的事件句柄OnDEMO().

4:在CPatternDemo中加入私有成员变量如下:

CDC *pdc;

CDC memDC;

CBitmap bmp;

CBrush brush;

UINT counter;

UINT mode;

UINT onrun;

5:用VC自带的位图编辑器,按上文要求编辑8个8*8像素的单色位图,命名为IDB_PATTERN1IDB_PATTERN8。

6:Import两个100*100像素的真彩bmp图片,命名为IDB_BMPSOURCE1和IDB_BMPSOURCE2。

7:使用ClassWizard为CPatternDemoDlg加入WM_CREATE的消息响应函数OnCreate(),并在其中添加如下代码:



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

    {

    bmp.LoadBitmap(IDB_PATTERN1+i);

    brush[i].CreatePatternBrush(&bmp);

    bmp.DeleteObject();

    }



8:在CPatternDemoDlg::OnDEMO()函数中添加如下代码:



    if(!onrun)

{

pdc=GetDC();

pdc->SetBkColor(RGB(0,0,0));

pdc->SetTextColor(RGB(255,255,255));

pdc->FillSolidRect(0,0,100,100,RGB(0,0,0));

memDC.CreateCompatibleDC(pdc);

bmp.LoadBitmap(IDB_BMPSOURCE1);

memDC.S

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号