标题：进度条
简述
进度条即计算机在处理任务时，实时的，以图片形式显示处理人物的速度，完成度，剩余未完成任务量的大小，和可能需要处理时间，一般以长方形条状显示。
历史
在数字运算机发明之前，就已经有了进度条的概念。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语言利用Windows API制作进度条实例
(来自网络)
C文件#include <windows.h>
#include <commctrl.h> //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"