Visual C++中的图形特技.doc_第1页
Visual C++中的图形特技.doc_第2页
Visual C++中的图形特技.doc_第3页
Visual C++中的图形特技.doc_第4页
Visual C++中的图形特技.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VisualC+中的图形特技随着计算机信息表示及实现的多媒体化,在许多学习软件、游戏软件,以及多媒体课件制作软件中,经常使用各种图形显示技巧,如图形的推拉、交错、雨滴状、百页窗、积木随机堆叠等显示模式。这样使画面变得更为生动活泼,更能吸引用户,也为更好地发挥软件的功能奠定了基础。本文就Visual C+ 6.0中实现图形的各种显示技巧的原理及具体方法做些探讨。 基本原理 在Visual C+6.0中,显示位图的方法及过程如下: 1. 显示程序资源中的位图(位图的所有数据均存在于可执行文件中) (1)从资源中装入位图 定义位图对象数据成员CBitmap m_Bitmap; 调用CBitmap成员函数LoadBitmap(),如m_Bitmap.LoadBitmap(IDB_BITMAP1); 传入LoadBitmap的参数是位图在图形编辑器中生成或从位图文件中引入时赋予的识别符。 (2)生成与位图相联系的内存设备情境对象 CDC MemDC; MemDC.CreateCompatibleDC(NULL); MemDC.SelectObject(&m_Bitmap); (3)显示位图 CClientDC ClientDC(this); BITMAP BM; m_Bitmap.GetObject(sizeof(BM),&BM); ClientDC.BitBlt ( X,Y, /目标设备逻辑横、纵坐标 BM.bmWidth, BM.bmHeight, /显示位图的像素宽、高度 &MemDC, /待显示位图数据的设备情境对象 0,0, /源数据中的横、纵坐标 SRCCOPY); /位操作方式 这种方法显示位图速度快,但不是很灵活,而且会使可执行文件增大。 2. 显示独立文件方式的位图(位图的所有数据独立于可执行文件) HBITMAP *hBitmap; /定义位图对象句柄 BITMAP BM; CDC MemDC; CClientDC ClientDC(this); MemDC.CreateCompatibleDC(&ClientDC); hBitmap=(HBITMAP*): LoadImage ( AfxGetInstanceHandle(), /取得应用程序句柄 “demo1.bmp”, /位图文件名 IMAGE_BITMAP, /类型为Windows位图 0,0, LR_LOADFROMFILE); /从文件中取位图数据 MemDC.SelectObject(hBitmap); : GetObject(hBitmap,sizeof(BM),&BM); ClientDC.BitBlt() /使用格式与方法一同 这种方法显示位图速度较之前一种慢了一点,但其灵活性较大,可以任意变换位图文件,而无需重新编译源程序, 也减小了可执行文件的大小。 实现方法 下面介绍各种图形显示技巧的具体实现原理及方法。以下所有程序算法的实现均可放在视类(CView,也可视自己的需要放在其他类)中处理,且有必要进行如下的相关操作: 增加如下类成员变量: BITMAP m_Bm; /保存位图的宽、高度等数据 HBITMAP *m_hBitmap; /保存位图数据句柄 CDC m_MemDC; /内存设备情境对象 在类构造函数中加入如下代码: m_MemDC.CreateCompatibleDC(NULL); /产生内存设备情境对象 m_hBitmap=(HBITMAP *):LoadImage( /从文件中装入位图数据 AfxGetInstanceHandle(), “demo1.bmp”, IMAGE_BITMAP, 0,0, LR_LOADFROMFILE ); m_MemDC.SelectObject(m_hBitmap); /将位图选入内存设备情境对象 :GetObject(m_hBitmap,sizeof(m_Bm),&m_Bm); 1. 水平交错效果 原理:将内存设备情境对象(如MemDC)中的位图数据拆分成奇、偶扫描线两部分,其中奇数条扫描线由上往下移动,偶数条扫描线则由下往上移动,且两者同时进行。屏幕上的效果为分别由上下两端出现的较淡栅栏图形,逐渐相互靠近,直至整个位图完全清楚。垂直交错效果的实现原理与之类似。 程序算法: int i,j; for ( i=0; i0 ) ClientDC.StretchBlt( /奇数,由上至下 0,j-1, /目标设备逻辑横、纵坐标 m_Bm.bmWidth,1, /显示位图的像素宽、高度 &m_MemDC, /源位图设备情境对象 0,m_Bm.bmHeight-(i-j-1), /源位图的起始横、纵坐标 m_Bm.bmWidth,1, /源位图的像素宽、高度 SRCCOPY); ClientDC.StretchBlt( /偶数,由下至上 0,m_Bm.bmHeight-j, /目标设备逻辑横、纵坐标 m_Bm.bmWidth,1, /显示位图的像素宽、高度 &m_MemDC, /源位图设备情境对象 0,i-j, /源位图的起始横、纵坐标 m_Bm.bmWidth,1, /源位图的像素宽、高度 SRCCOPY); j-=2; / while ( j0 ) Sleep(10); /for ( i=0; i=m_Bm.bmHeight; i+ =2 ) 2. 雨滴效果 原理:将内存设备情境对象(如MemDC)中位图数据的最后一条扫描线,顺序地从目标设备(如ClientDC)中待显示位图的第一条扫描线所在位置移动至最后一条处,并保留此条扫描线在屏幕上移动时留下的轨迹。接着再把MemDC中位图数据的倒数第二条扫描线,顺序地从目标设备(如ClientDC)中待显示位图的第一条扫描线所在位置移动至倒数第二条处。其余的扫描线依此类推。 程序算法: int i,j; for ( i=0; i=m_Bm.bmHeight; i+ ) for ( j=0; j=m_Bm.bmHeight-i; j+ ) ClientDC.StretchBlt( 0,j, /目标设备逻辑横、纵坐标 m_Bm.bmWidth,1, /显示位图的像素宽、高度 &m_MemDC, /源位图设备情境对象 0,m_Bm.bmHeight-i, /源位图的起始横、纵坐标 m_Bm.bmWidth,1, /源位图的像素宽、高度 SRCCOPY); Sleep(20); /for ( i=0; i=m_Bm.bmHeight; i+ ) 3. 百叶窗效果 原理:将内存设备情境对象(如MemDC)中的位图数据分成若干组,然后分别从第一组到最后一组进行搬移,第一次搬移每组中第一条扫描线到目标设备(如ClientDC)中待显示位图的相应位置,第二次搬移每组中第二条扫描线,接着第三条、第四条扫描线。 程序算法: int i,stepi,j; stepi=m_Bm.bmHeight/10; for ( i=0; i=stepi; i+ ) for ( j=0; j10; j+ ) ClientDC.StretchBlt( 0,j*stepi+i, /目标设备逻辑横、纵坐标 m_Bm.bmWidth,1, /显示位图的像素宽、高度 &m_MemDC, /源位图设备情境对象 0,j*stepi+i, /源位图的起始横、纵坐标 m_Bm.bmWidth,1, /源位图的像素宽、高度 SRCCOPY); Sleep(20); /for ( i=0; i=stepi; i+ ) 4. 随机积木效果 原理:将内存设备情境对象(如MemDC)中的位图数据分成纵横十等份共一百组数据,然后随机地取出这一百组数据中的某一组显示到目标设备(如ClientDC)中待显示位图的相应位置,如此反复直到所有一百组数据均显示完毕为止。 程序算法: int i,j,stepx,stepy,dispnum,x,y; int pxy10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论