參考 ACDSee 螢幕保護程式與李建湘《閃屏圖形特技效果》,採用**塊狀渲染 + 雙重步長控制**,而非隨機塊排序,大幅降低計算複雜度。
int m_nBlockNum; // X/Y 方向均分塊數 (如 600)
int m_nXStep, m_nYStep; // 組內步長:決定下一塊相對位置
int m_nDelay; // 組間延遲 (ms)
BOOL m_bDirection; // 起始角:TRUE=左上, FALSE=右下
// 組外迴圈:控制起始偏移 (x, y)
for (int x = m_bDirection ? 0 : m_nBlockNum-1,
y = m_bDirection ? 0 : m_nBlockNum-1;
m_bDirection ? (x < m_nBlockNum) : (x >= 0);
x += m_bDirection ? 1 : -1, y += m_bDirection ? 1 : -1) {
// 組內迴圈:依步長跳躍渲染
for (int j=0; j<m_nBlockNum; j++) {
if (x >= m_nBlockNum) x -= m_nBlockNum;
if (y >= m_nBlockNum) y -= m_nBlockNum;
dc.StretchBlt(
x*stepx, y*stepy, stepx, stepy, // 目標矩形
&MemDC, x*stepx, y*stepy, stepx, stepy, // 來源矩形
SRCCOPY);
x += m_nXStep; y += m_nYStep; // 步長跳躍
}
Sleep(m_nDelay); // 組間延遲產生動畫感
}
| 外部步長 | 內部步長 | 效果描述 | 完整顯示 |
|---|---|---|---|
| (0, i+1) | (1, 0) | 垂直向下逐行顯示 | ✓ |
| (0, i+1) | (1, m_nBlockNum) | 垂直向下,單行跳躍 | ✓ |
| (0, i+1) | (1, 1) | 對角線向左下擴散,右上自動補齊 | ✓ |
| (0, i+1) | (1, 2) | 水平 1/2 處雙線向左下 | ✓ |
| (0, i+1) | (1, 3) | 水平 1/3, 2/3 三線向左下 | ✓ |
| (i+1, 0) | (200, 1) | 水平「日式推拉門」效果 | ✓ |
| (0, i+1) | (1, 20) | **瀑布流** (m_nDelay=15) | ✓ |
| (i+1, i+1) | (0, 2) | **半透明窗口模擬** (強力推薦) | ✗ (文字輕微扭曲) |
| (i+1, i+1) | (2, 0) | 垂直半透明模擬 | ✗ |
class CDynamicSplash : public CSplashBase { // 繼承李建湘基礎類
// ... 參數成員 ...
virtual void RenderEffect(CDC& dc, CDC& MemDC, int stepx, int stepy);
// 覆寫渲染邏輯,完全替換原隨機塊演算法
};
作者誠徵高手指導:**如何實現漸開線展開效果**?歡迎交流。