Windows 開機時的動態色帶條是許多開發者想要在自家應用程式中重現的經典視覺效果。本文將詳細介紹如何從系統核心檔案提取開機畫面資源,並透過 MFC 多執行緒技術實現流暢的動態色帶動畫。
首先需要使用 Resource Hacker (ResHacker) 從 NTOSKRNL.EXE 中提取開機畫面位圖資源。具體步驟如下:
NTOSKRNL.EXEdynaline.bmp
圖一 使用 Resource Hacker 取得開機畫面資源
在 Visual C++ 中建立一個對話框型專案 DemoLine,並完成以下設定:
dynaline.bmp 匯入專案資源,資源 ID 設為 IDB_DYNLINECStatic 的新類別 CDynLine,專門負責動畫顯示邏輯在 CDynLine 類別中加入工作執行緒,透過雙重 BitBlt 操作實現色帶滾動效果:
UINT DispThread(LPVOID lpParam)
{
CDynLine* pWnd = (CDynLine*)lpParam;
CClientDC dcClient(pWnd);
CDC dcMem;
dcMem.CreateCompatibleDC(&dcClient);
BITMAP bits;
pWnd->m_bmp.GetBitmap(&bits);
CBitmap *pBmp = (CBitmap*)dcMem.SelectObject(pWnd->m_bmp);
CSize size(0,0);
while(g_lDisplay)
{
if(size.cx < bits.bmWidth)
size.cx += 2;
else
size.cx = 0;
// 雙重繪製實現無縫循環滾動
dcClient.BitBlt(0, 0, size.cx, bits.bmHeight, &dcMem,
(bits.bmWidth - size.cx), 0, SRCCOPY);
dcClient.BitBlt(size.cx, 0, (bits.bmWidth - size.cx),
bits.bmHeight, &dcMem, 0, 0, SRCCOPY);
Sleep(20);
}
return 1;
}
核心演算法原理:不斷移動填充圖像的顯示位置,透過兩次 BitBlt 將圖像頭尾相連,形成無縫循環滾動視覺效果。
在 CDynLine 中實作 Start() 和 Stop() 方法控制動畫播放,透過修改全域變數 g_lDisplay 狀態值即可。為確保多執行緒環境下讀寫安全,採用 InterlockedIncrement 和 InterlockedDecrement 原子操作函數。
最後將對話框中 Picture 控制項的類別從 CStatic 修改為 CDynLine,即可完成整合。
圖二 程式執行介面示意
此動態色帶類別可廣泛應用於各類專案中,作為長時間運算處理的視覺回饋指示器,直觀告知使用者程式正在執行中,提升使用者體驗。完整原始碼已隨文提供。