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

自製啟動畫面:隨機積木特效實作

     編輯:關於VC++

設計概念

啟動畫面本質是無標題彈出視窗(WS_POPUP),繼承 CWnd。特效採用「隨機積木法」:將位圖切成 20×20=400 區塊,隨機順序以 StretchBlt 複製到目標 DC,形成拼圖漸現效果。

啟動畫面特效

類別 CLjxWnd 實作

成員變數

CDC MemDC;      // 記憶體 DC
BITMAP bm;      // 位圖資訊
CBitmap m_bmp;  // 位圖物件
CBitmap* old_bmp;

建構函式

m_bmp.LoadBitmap(IDB_BITMAP1);
m_bmp.GetBitmap(&bm); // 取得寬高

建立視窗

CreateEx(0, AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
         "animatesplash", WS_POPUP, 0,0, bm.bmWidth, bm.bmHeight, NULL, NULL, NULL);

OnPaint 隨機積木演算法

MemDC.CreateCompatibleDC(NULL);
old_bmp = MemDC.SelectObject(&m_bmp);

int stepX = bm.bmWidth / 20, stepY = bm.bmHeight / 20;
int shown[20][20] = {0}, count = 0;
srand((unsigned)time(NULL));

while (count < 400) {
    int x = rand() % 20, y = rand() % 20;
    if (shown[x][y]) continue;
    shown[x][y] = 1;

    dc.StretchBlt(x*stepX, y*stepY, stepX, stepY,
                  &MemDC, x*stepY, y*stepY, stepX, stepY, SRCCOPY);
    count++; Sleep(10);
}
MemDC.SelectObject(old_bmp);

應用程式啟動流程整合

BOOL CMyApp::InitInstance() {
    // ... 標準初始化 ...
    CLjxWnd* pSplash = new CLjxWnd;
    pSplash->CreateLjxWnd();
    pSplash->CenterWindow();
    pSplash->ShowWindow(SW_SHOW);
    pSplash->UpdateWindow(); // 觸發 OnPaint
    Sleep(2000);             // 停留 2 秒
    pSplash->SendMessage(WM_CLOSE);
    delete pSplash;

    CMyDlg dlg; m_pMainWnd = &dlg; dlg.DoModal();
    return FALSE;
}

進階擴充方向

  • 淡入/淡出(Alpha Blending)
  • 載入進度條同步顯示
  • 支援 GIF/動畫啟動畫面
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved