?? effectdisplay.cpp
字號:
#include "StdAfx.h"
#include "mainfrm.h"
#include "EffectDisplay.h"
#include <cmath>
// 靜態(tài)成員變量初始化
int EffectDisplay::s_nOffsetX = 0;
int EffectDisplay::s_nOffsetY = 0;
int EffectDisplay::s_nPicWidth = 0;
int EffectDisplay::s_nPicHeight = 0;
int EffectDisplay::s_nCDCWidth = 0;
int EffectDisplay::s_nCDCHeight = 0;
/******************************************************************************
* 作用: 延時函數(shù)
* 參數(shù):
* dwMilliseconds 延時時間,單位毫秒
******************************************************************************/
void EffectDisplay::DelayTime(DWORD dwMilliseconds)
{
LARGE_INTEGER litmp;
LONGLONG lTimeBeign;
LONGLONG lTimeEnd;
double dMinus;
double dFreq;
double dTim;
QueryPerformanceFrequency(&litmp); // 獲得機(jī)器內(nèi)部定時器的時鐘頻率
dFreq = (double)litmp.QuadPart; // 獲得計數(shù)器的時鐘頻率
QueryPerformanceCounter(&litmp);
lTimeBeign = litmp.QuadPart; // 獲得時間起始值
do
{
QueryPerformanceCounter(&litmp);
lTimeEnd = litmp.QuadPart; //獲得中止值
dMinus = (double)(lTimeEnd - lTimeBeign);
dTim = dMinus / dFreq; // 獲得對應(yīng)的時間值,單位為秒
} while (dTim < dwMilliseconds * 0.001);
}
/******************************************************************************
* 作用: 向下掃描特效
******************************************************************************/
void EffectDisplay::ScanDownDisplay(CDC* pDC, CDC* pMemDC)
{
// 掃描高度
int nHeight = min(s_nPicHeight, s_nCDCHeight);
// 掃描寬度
int nWidth = min(s_nPicWidth, s_nCDCWidth);
for (int i = 0; i <= nHeight; i += 1)
{
pDC->BitBlt(s_nOffsetX, i + s_nOffsetY, nWidth, 1,
pMemDC, s_nOffsetX, i + s_nOffsetY, SRCCOPY);
DelayTime(1);
}
}
/******************************************************************************
* 作用: 垂直雙重掃描特效
******************************************************************************/
void EffectDisplay::VSScanDisplay(CDC* pDC, CDC* pMemDC)
{
// 掃描高度
int nHeight = min(s_nPicHeight, s_nCDCHeight);
// 掃描寬度
int nWidth = min(s_nPicWidth, s_nCDCWidth);
for (int i = 0; i <= nHeight / 2; i += 1)
{
// 上面部分
pDC->BitBlt(s_nOffsetX, i + s_nOffsetY, nWidth, 1,
pMemDC, s_nOffsetX, i + s_nOffsetY, SRCCOPY);
// 下面部分
pDC->BitBlt(s_nOffsetX, nHeight - i + s_nOffsetY, nWidth, 1,
pMemDC, s_nOffsetX, nHeight - i + s_nOffsetY, SRCCOPY);
DelayTime(2);
}
}
/******************************************************************************
* 作用: 向右移動特效
******************************************************************************/
void EffectDisplay::MoveRightDisplay(CDC* pDC, CDC* pMemDC)
{
// 掃描高度
int nHeight = min(s_nPicHeight, s_nCDCHeight);
for (int i = 0; i <= s_nCDCWidth - s_nOffsetX; i += 2)
{
pDC->BitBlt(0, s_nOffsetY, i, nHeight,
pMemDC, s_nCDCWidth - s_nOffsetX - i, s_nOffsetY, SRCCOPY);
DelayTime(1);
}
// 修正圖像位置
pDC->BitBlt(0, s_nOffsetY, s_nCDCWidth - s_nOffsetX, nHeight,
pMemDC, 0, s_nOffsetY, SRCCOPY);
}
/******************************************************************************
* 作用: 水平雙重移動特效
******************************************************************************/
void EffectDisplay::HSMoveDisplay(CDC* pDC, CDC* pMemDC)
{
// 掃描高度
int nHeight = min(s_nPicHeight, s_nCDCHeight);
// 掃描寬度
int nWidth = min(s_nPicWidth, s_nCDCWidth);
for (int i = 0; i <= s_nCDCWidth / 2; i += 2)
{
// 左面部分
pDC->BitBlt(0, s_nOffsetY, i, nHeight,
pMemDC, nWidth / 2 - i + s_nOffsetX, s_nOffsetY, SRCCOPY);
// 右面部分
pDC->BitBlt(s_nCDCWidth - i, s_nOffsetY, i, nHeight,
pMemDC, nWidth / 2 + s_nOffsetX, s_nOffsetY, SRCCOPY);
DelayTime(1);
}
// 修正圖像位置
pDC->BitBlt(0, s_nOffsetY, s_nCDCWidth - s_nOffsetX, nHeight,
pMemDC, 0, s_nOffsetY, SRCCOPY);
}
/******************************************************************************
* 作用: 垂直百葉窗特效
******************************************************************************/
void EffectDisplay::VBlindDisplay(CDC* pDC, CDC* pMemDC)
{
// 掃描高度
int nHeight = min(s_nPicHeight, s_nCDCHeight);
// 掃描寬度
int nWidth = min(s_nPicWidth, s_nCDCWidth);
// 百葉窗寬度
int nScanLine = 8;
for (int i = 0; i < nScanLine; i++)
{
for (int j = 0; j < nWidth; j += nScanLine)
{
pDC->BitBlt(j + i + s_nOffsetX, s_nOffsetY, 1, nHeight,
pMemDC, j + i + s_nOffsetX, s_nOffsetY, SRCCOPY);
}
DelayTime(50);
}
}
/******************************************************************************
* 作用: 水平百葉窗特效
******************************************************************************/
void EffectDisplay::HBlindDisplay(CDC* pDC, CDC* pMemDC)
{
// 掃描高度
int nHeight = min(s_nPicHeight, s_nCDCHeight);
// 掃描寬度
int nWidth = min(s_nPicWidth, s_nCDCWidth);
// 百葉窗寬度
int nScanLine = 8;
for (int i = 0; i < nScanLine; i++)
{
for (int j = 0; j < nHeight; j += nScanLine)
{
pDC->BitBlt(s_nOffsetX, j + i + s_nOffsetY, nWidth, 1,
pMemDC, s_nOffsetX, j + i + s_nOffsetY, SRCCOPY);
}
DelayTime(50);
}
}
/******************************************************************************
* 作用: 垂直柵條特效
******************************************************************************/
void EffectDisplay::VRasterDisplay(CDC* pDC, CDC* pMemDC)
{
// 掃描高度
int nHeight = min(s_nPicHeight, s_nCDCHeight);
// 掃描寬度
int nWidth = min(s_nPicWidth, s_nCDCWidth);
int nScanLine = 16;
for (int i = 0; i <= nHeight + s_nOffsetY; i++)
{
for (int j = 0; j <= nWidth; j += 2 * nScanLine)
{
pDC->BitBlt(j + s_nOffsetX, 0, nScanLine, i,
pMemDC, j + s_nOffsetX, nHeight + s_nOffsetY - i, SRCCOPY);
int k = j + nScanLine;
pDC->BitBlt(k + s_nOffsetX, nHeight + s_nOffsetY - i, nScanLine, i + s_nOffsetY,
pMemDC, k + s_nOffsetX, 0, SRCCOPY);
}
DelayTime(1);
}
}
/******************************************************************************
* 作用: 水平柵條特效
******************************************************************************/
void EffectDisplay::HRasterDisplay(CDC* pDC, CDC* pMemDC)
{
// 掃描高度
int nHeight = min(s_nPicHeight, s_nCDCHeight);
// 掃描寬度
int nWidth = min(s_nPicWidth, s_nCDCWidth);
int nScanLine = 16;
for (int i = 0; i <= nWidth + s_nOffsetX; i++)
{
for (int j = 0; j <= nHeight; j += 2 * nScanLine)
{
pDC->BitBlt(0, j + s_nOffsetY, i, nScanLine,
pMemDC, nWidth + s_nOffsetX - i, j + s_nOffsetY, SRCCOPY);
int k = j + nScanLine;
pDC->BitBlt(nWidth + s_nOffsetX - i, k + s_nOffsetY, i + s_nOffsetX, nScanLine,
pMemDC, 0, k + s_nOffsetY, SRCCOPY);
}
DelayTime(1);
}
}
/******************************************************************************
* 作用: 馬賽克特效
******************************************************************************/
void EffectDisplay::MosaicDisplay(CDC* pDC, CDC* pMemDC)
{
int nTileSize = 24; // 馬賽克小方塊大小
int nRw = 0;
int nRh = 0;
if (s_nPicWidth % nTileSize != 0)
nRw = 1;
if (s_nPicHeight % nTileSize != 0)
nRh = 1;
// 計算小方塊的個數(shù)
int nTileCount = (s_nPicWidth / nTileSize + nRw) * (s_nPicHeight / nTileSize + nRh);
CPtrArray points; // 保存所有小方塊的左上坐標(biāo)
long lx = 0;
long ly = 0;
for (int k = 0; k < nTileCount; k++)
{
CPoint* point = new CPoint;
point->x = lx;
point->y = ly;
lx = lx + nTileSize;
if (lx >= s_nPicWidth)
{
lx = 0;
ly = ly + nTileSize;
}
points.Add(point);
}
int nDelayTime = 2;
if (s_nPicHeight * s_nPicWidth > 600 * 500)
nDelayTime = 1;
LARGE_INTEGER seed;
QueryPerformanceFrequency(&seed);
QueryPerformanceCounter(&seed);
//初始化一個以微秒為單位的時間種子
srand((int)seed.QuadPart);
for (int i = nTileCount - 1; i >= 0; i--)
{
int n = rand() % (i + 1);
CPoint* point = (CPoint*)points[n];
lx = point->x;
ly = point->y;
pDC->BitBlt(lx + s_nOffsetX, ly + s_nOffsetY, nTileSize, nTileSize,
pMemDC, lx + s_nOffsetX, ly + s_nOffsetY, SRCCOPY);
SAFE_DELETE (point);
points.RemoveAt(n);
DelayTime(nDelayTime);
}
}
/******************************************************************************
* 作用: 雨滴特效
******************************************************************************/
void EffectDisplay::RaindropDisplay(CDC* pDC, CDC* pMemDC)
{
// 掃描高度
int nHeight = min(s_nPicHeight, s_nCDCHeight);
// 掃描寬度
int nWidth = min(s_nPicWidth, s_nCDCWidth);
for (int i = 0; i <= nHeight + s_nOffsetY; i++)
{
for (int j = 0; j <= nHeight + s_nOffsetY - i; j++)
{
pDC->BitBlt(s_nOffsetX, j, nWidth, 1,
pMemDC, s_nOffsetX, nHeight + s_nOffsetY - i, SRCCOPY);
}
DelayTime(1);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -