一、首先使用 ResHacker 將 NTOSKRNL.EXE 中的資源 HACK 出來,安裝過 ResHacker 後,找到系統目錄下的 NTOSKRNL.EXE, 然後打開文件,在位圖資源處找到我們需要的 Windows 開機畫面,然後用保存資源成BMP的方式將資源導出到一個BMP文件,通過簡單的處理就可以得到靜態的色帶的BMP文件 dynaline.bmp 了!:->:
圖一 使用 ResHacker 得到開機畫面
二、程序設計
接下來我們需要在 VC 中創建一個簡單的對話框工程 DemoLine
導入我們獲得的靜態位圖 dynaline.bmp,在工程中加入一個bitmap 資源 IDB_DYNLINE
在的對話框中加入靜態的 Picture 控件,將 CStatic 屬性設成 bitmap,
然後創建一個派生於 CStatic 的 MFC 新類 CDynLine,我們讓這個類來完成動畫顯示!
在類 CDynLine 的實現代碼中加入工作線程,它負責將靜態的畫面顯示成動態的色帶條,代碼如下:
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;
}
動態顯示的算法很簡單,就是不斷移動填充圖象的位置。
三、在 CDynLine 中加入控制圖象移動的方法 Start() 和 Stop(),很輕松,改變全局變量g_lDisplay的值就OK了。
但是需要注意的是同步問題,使用InterlockedIncrement和InterlockedDecrement函數可以保證正確讀寫。
最後,在對話框程序中把靜態圖象控件的類 CStati c改 成CDynLine 就大功告成了!
圖二 程序顯示界面
四、使用這樣的一個類用於其他的工程,通過動態的色帶告訴用戶程序正在處理狀態,很直觀,且簡單明了。
本文配套源碼