程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 模擬Windows開機動態色帶條

模擬Windows開機動態色帶條

編輯:關於VC++

一、首先使用 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 就大功告成了!

圖二 程序顯示界面

四、使用這樣的一個類用於其他的工程,通過動態的色帶告訴用戶程序正在處理狀態,很直觀,且簡單明了。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved