首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

Visual C++ 經典圖形特效實現:交錯、雨滴、百葉窗、隨機積木

     編輯:VC++

基礎:位圖顯示兩種方式

  • 資源位圖:CBitmap::LoadBitmap(IDB_BITMAP1) → CDC::SelectObject → BitBlt。速度快,但編入 EXE 增大體積。
  • 文件位圖:LoadImage(..., LR_LOADFROMFILE) 獲取 HBITMAP → SelectObject → BitBlt。靈活,不增大 EXE,支援運行時替換素材。

本文特效均基於文件位圖 + 內存 DC (m_MemDC) + 客戶區 DC (ClientDC) 實現動畫幀逐行/逐塊繪制。

特效一:水平交錯

效果:奇數掃描線從上往下,偶數掃描線從下往上,雙向匯聚成圖。
算法:外層循環步長 2 遍歷行號 i,內層將第 i 行畫到目標 j-1 (奇數下移),第 m_Bm.bmHeight-j 行畫到目標對應位置 (偶數上移)。

for (int i = 0; i <= bmHeight; i += 2) {
    for (int j = i; j > 0; j -= 2) {
        // 奇數行:源 y = bmHeight - (i-j-1) → 目標 y = j-1
        ClientDC.StretchBlt(0, j-1, bmWidth, 1, &m_MemDC, 0, bmHeight-(i-j-1), bmWidth, 1, SRCCOPY);
        // 偶數行:源 y = i-j → 目標 y = bmHeight-j
        ClientDC.StretchBlt(0, bmHeight-j, bmWidth, 1, &m_MemDC, 0, i-j, bmWidth, 1, SRCCOPY);
    }
    Sleep(10);
}

特效二:雨滴

效果:最後一行像雨滴落下留下軌跡,倒數第二行緊隨其後,直至第一行。
算法:外層循環源行 i (從底部向上),內層將該行在目標區從頂部 (y=0) 移動到目標行 bmHeight-i。

for (int i = 0; i <= bmHeight; i++) {
    for (int j = 0; j <= bmHeight - i; j++) {
        ClientDC.StretchBlt(0, j, bmWidth, 1, &m_MemDC, 0, bmHeight-i, bmWidth, 1, SRCCOPY);
    }
    Sleep(20);
}

特效三:百葉窗

效果:將圖像橫向分成 N 條條帶 (如 10 條),每條帶內掃描線同步逐行顯示,形成百葉窗打開感。
算法:條帶高 step = bmHeight/10。外層循環行偏移 i,內層遍歷 10 條帶,每條帶目標 y = k*step + i,源 y 同步。

int step = bmHeight / 10;
for (int i = 0; i <= step; i++) {
    for (int k = 0; k < 10; k++) {
        ClientDC.StretchBlt(0, k*step+i, bmWidth, 1, &m_MemDC, 0, k*step+i, bmWidth, 1, SRCCOPY);
    }
    Sleep(20);
}

特效四:隨機積木

效果:圖像分 10x10 = 100 塊,隨機順序彈出,拼湊成完整圖。
算法:塊寬 stepX = bmWidth/10,塊高 stepY = bmHeight/10。pxy[10][10] 標記已顯示塊。循環隨機取 (x,y),未顯示則 StretchBlt 繪製該塊,標記已顯示,直到 100 塊全滿。

int pxy[10][10] = {0};
int stepX = bmWidth/10, stepY = bmHeight/10;
srand((unsigned)time(NULL));
int disp = 0;
while (disp < 100) {
    int x = rand() % 10, y = rand() % 10;
    if (pxy[x][y]) continue;
    pxy[x][y] = 1;
    ClientDC.StretchBlt(x*stepX, y*stepY, stepX, stepY, &m_MemDC, x*stepX, y*stepY, stepX, stepY, SRCCOPY);
    disp++;
    Sleep(30);
}

通用初始化代碼 (構造函數)

m_MemDC.CreateCompatibleDC(NULL);
m_hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), _T("demo1.bmp"),
                               IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_MemDC.SelectObject(m_hBitmap);
GetObject(m_hBitmap, sizeof(m_Bm), &m_Bm); // 獲取寬高

擴展與應用

  • 垂直交錯:交換 x/y 邏輯即可。
  • 組合特效:如先百葉窗後雨滴,豐富演示效果。
  • 雙緩衝優化:將 ClientDC 替換為內存 DC,最後 BitBlt 到屏幕,消除動畫閃爍。
  • 多媒體課件、遊戲過場動畫、啟動畫面等場景直接應用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved