-
進度條
鎖定
進度條即計算機在處理任務時,實時的,以圖片形式顯示處理任務的速度,完成度,剩餘未完成任務量的大小,和可能需要處理時間,一般以長方形條狀顯示。
- 中文名
- 進度條
- 外文名
- progress bar
- 作 用
- 以圖片形式顯示處理任務的速度
- 形 狀
- 長方形
- 運行時間段
- 計算機處理任務時
進度條歷史背景
在數字運算機發明之前,就已經有了進度條的概念。1896 年,Karol Adamiecki(波蘭人;經濟學家,工程師和管理研究人員),發明了一種叫做harmonogram(波蘭語,時間表)的圖表;1903年,他的理論在俄羅斯技術界引起了轟動。他在波蘭雜誌《 Przegląd Techniczny 》發表了一些文章(1909)。 1931年,他發表了一篇更廣為人知的文章《armonogram or harmonograf.》(波蘭語,日程或時間表),描述他的圖。Adamiecki只是在波蘭和俄羅斯發表這些文章,較少被英語國家瞭解。
同一時間,亨利·甘特(Henry Gantt)提出類似的方法已在西方普及,他在1910年和1915年都發表過文章。算是以訛傳訛吧,Adamiecki的圖表就被叫做為甘特圖。這個概念後來被用於計算領域。
[1]
進度條處理方法
以文件處理為例
單個文件的進度處理方法:
使用CopyFileEx進行文件複製,這個函數專門提供了一個回調函數用來處理你的進度條,詳細參見MSDN。
如果一批文件,首先獲得文件的數量count = 文件數量
設置進條的範圍為0至count,每完成一個文件,就向前進一步。
進度條C語言
(來自網絡)
進度條C文件
#include #include //InitCommonControls //過程函數的返回值都是LRESULT,類型都是CALLBACK LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpszCmdLine,int nCmdShow) { HWND hwnd; //主窗口句柄,在CreateWindow中賦值 MSG msg; //消息變量,在GetMessage中使用 WNDCLASS wndclass; //窗口類 TCHAR* szAppName = TEXT("ProgressBar"); //類名和窗口名 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景 wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); //鼠標 wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); //圖標 wndclass.lpszClassName = szAppName; //類名 wndclass.cbClsExtra = 0; //類的額外參數 wndclass.cbWndExtra = 0; //窗口的額外參數.用於基於同一窗口類的窗口各自區分. //在自定義對話框類時必須指定為DLGWINDOWEXTRA的大小 wndclass.lpszMenuName = NULL; //菜單名.可以用作子窗口的id wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口風格 wndclass.lpfnWndProc = WndProc; //窗口過程 wndclass.hInstance = hInstance; //包含窗口過程的實例句柄 if( !RegisterClass(&wndclass) ) //註冊窗口類 return 0; hwnd = CreateWindow( //創建窗口 szAppName, //窗口類名 szAppName, //窗口標題 WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX, //窗口風格 CW_USEDEFAULT, //初始的x座標 CW_USEDEFAULT, //初始的y座標 480, //初始的寬度 200, //初始的高度 NULL, //父窗口 NULL, //菜單 hInstance, //和窗口相關的實例句柄 NULL //額外參數 ); ShowWindow( hwnd,nCmdShow ); //顯示窗口 UpdateWindow( hwnd ); //更新窗口 while( GetMessage(&msg,NULL,0,0) ) //消息循環 { TranslateMessage(&msg); //將WM_XXXKEYXXX消息翻譯為WM_CHAR消息 DispatchMessage(&msg); //傳遞消息到窗口過程 } return msg.wParam; //返回 } DWORD WINAPI PBThreadProc( LPVOID lpParameter ) { HWND hwndPB = (HWND) lpParameter; //進度條的窗口句柄 PBRANGE range; //進度條的範圍 SendMessage( hwndPB, PBM_SETRANGE, //設置進度條的範圍 (WPARAM)0, (LPARAM)(MAKELPARAM(0,100)) ); SendMessage( hwndPB, PBM_GETRANGE, //獲取進度條的範圍 (WPARAM)TRUE, //TRUE 表示返回值為範圍的最小值,FALSE表示返回最大值 (LPARAM)&range ); while(TRUE) { SendMessage( hwndPB, PBM_DELTAPOS, //設置進度條的新位置為當前位置加上範圍的1/40 (WPARAM)((range.iHigh-range.iLow)/40), (LPARAM)0 ); if( SendMessage( hwndPB, PBM_GETPOS, (WPARAM)0, (LPARAM)0 ) //取得進度條當前位置 == range.iHigh ) { SendMessage( hwndPB, PBM_SETPOS, (WPARAM)range.iLow, (LPARAM)0 ); //將進度條復位 } Sleep(1000); //每1秒更新一次進度條 } } LRESULT WINAPI WndProc( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam ) { static HWND hwndPB; switch( message ) { case WM_CREATE: { InitCommonControls(); //確保已註冊了進度條類PROGRESS_CLASS hwndPB = CreateWindowEx( 0, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE, 0,0,0,0, //位置和大小在WM_SIZE中設置 hwnd, (HMENU)0, ((LPCREATESTRUCT)lParam)->hInstance, NULL); CreateThread( //操作進度條的線程 NULL, 0, (LPTHREAD_START_ROUTINE)PBThreadProc, hwndPB, 0, 0 ); return 0; } case WM_SIZE: { RECT rc; GetClientRect(hwnd, &rc); MoveWindow( hwndPB, rc.left, (rc.bottom - rc.top )/4, rc.right - rc.left, (rc.bottom - rc.top )/10, TRUE ); return 0; } case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc( hwnd,message,wParam,lParam ); }
進度條樣式的修改
可以用到資源文件(.rc)
//
// SUPPORT FOR WINDOWS XP THEMES:
// THIS WILL MAKE THE PROGRAM USE THE COMMON CONTROLS
// LIBRARY VERSION 6.0 (IF IT IS AVAILABLE)
//
1 24 "CtrlProgressBar.exe.Manifest"
- 參考資料
-
- 1. 進度條是誰最先發明的? .果殼網 - 科技有意思[引用日期2012-09-26]