实现方法 下面介绍各种图形显示技巧的具体实现原理及方法。以下所有程序算法的实现均可放在视类(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; i<=m_Bm.bmHeight; i+=2 ) {j = i; while ( j>0 ) {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 ( j>0 ) Sleep(10); } //for ( i=0; i<=m_Bm.bmHeight; i+ =2 )
|