複製鏈接
請複製以下鏈接發送給好友

進度條

鎖定
進度條即計算機在處理任務時,實時的,以圖片形式顯示處理任務的速度,完成度,剩餘未完成任務量的大小,和可能需要處理時間,一般以長方形條狀顯示。
中文名
進度條
外文名
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"
參考資料