A progress bar is a window that an application can use to indicate the progress of a lengthy operation. It consists of a rectangle that is gradually filled with the system highlight color as an operation progresses. The following illustration shows a progress bar positioned along the bottom of a window.

You create a progress bar by using the
A progress bar's range represents the entire duration of the operation, and the current position represents the progress that the application has made toward completing the operation. The window procedure uses the range and the current position to determine the percentage of the progress bar to fill with the highlight color. Because the range and current position values are expressed as unsigned integers, the highest possible range or current position value is 65,535.
The minimum value in the range can be from 0 to 65,535. Likewise, the
maximum value can be from 0 to 65,535. If you do not set the range values, the
system sets the minimum value to 0 and the maximum value to 100. You can
adjust the range to convenient integers by using the
A progress bar provides several messages that you can use to set the
current position. The
The
This section describes the messages handled by the window procedure for the PROGRESS_CLASS class.
| Message | Processing performed |
|---|---|
| WM_CREATE | Allocates and initializes an initial structure. |
| WM_DESTROY | Frees all resources associated with the progress bar. |
| WM_ERASEBKGND | Draws the background and borders of the progress bar. |
| WM_GETFONT | Returns the handle to the current font. The progress bar does not currently draw text, so sending this message has no effect on the control. |
| WM_PAINT | Draws the progress bar. If the wParam parameter is non-NULL, the control assumes that the value is an HDC and paints using that device context. |
| WM_SETFONT | Saves the handle to the new font and returns the handle to the previous font. The progress bar does not currently draw text, so sending this message has no effect on the control. |
The following example shows how to use a progress bar to indicate the progress of a lengthy file-parsing operation. The example creates a progress bar and positions it along the bottom of the parent window's client area. The height of the progress bar is based on the height of the arrow bitmap used in a scroll bar. The range is based on the size of the file divided by 2048, which is the size of each "chunk" of data read from the file. The example also sets an increment and advances the current position of the progress bar by the increment after parsing each chunk.
Example
// ParseALargeFile - parses a large file and uses a
// progress bar to indicate the progress of the
// parsing operation.
// Returns TRUE if successful, or FALSE otherwise.
// hwndParent - parent window of the progress bar.
// lpszFileName - name of the file to parse.
//
// Global variable
// g_hinst - instance handle
extern HINSTANCE g_hinst;
BOOL ParseALargeFile(HWND hwndParent, LPSTR lpszFileName)
{
RECT rcClient; // Client area of parent window
int cyVScroll; // Height of scroll bar arrow
HWND hwndPB; // Handle of progress bar
HANDLE hFile; // Handle of file
DWORD cb; // Size of file and count of
// bytes read
LPCH pch; // Address of data read from
// file
LPCH pchTmp; // Temporary pointer
// Ensure that the common control DLL is loaded
// and create a progress bar along the bottom of
// the client area of the parent window.
// Base the height of the progress bar on the
// height of a scroll bar arrow.
InitCommonControls();
GetClientRect(hwndParent, &rcClient);
cyVScroll = GetSystemMetrics(SM_CYVSCROLL);
hwndPB = CreateWindowEx(0, PROGRESS_CLASS,
(LPSTR) NULL, WS_CHILD | WS_VISIBLE,
rcClient.left, rcClient.bottom
cyVScroll, rcClient.right, cyVScroll,
hwndParent, (HMENU) 0, g_hinst, NULL);
// Open the file for reading, and retrieve the
// size of the file.
hFile = CreateFile(lpszFileName, GENERIC_READ,
FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES)
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
if (hFile == (HANDLE) INVALID_HANDLE_VALUE)
return FALSE;
cb = GetFileSize(hFile, (LPDWORD) NULL);
// Set the range and increment of the progress
// bar.
SendMessage(hwndPB, PBM_SETRANGE, 0,
MAKELPARAM(0, cb / 2048));
SendMessage(hwndPB, PBM_SETSTEP, (WPARAM) 1, 0);
// Parse the file.
pch = (LPCH) LocalAlloc(LPTR, sizeof(char) *
2048);
pchTmp = pch;
do {
ReadFile(hFile, pchTmp, sizeof(char) * 2048,
&cb,
(LPOVERLAPPED) NULL);
// TODO: Write an error handler to check that all the
// requested data was read.
.
.
// Include here any code that parses the
// file.
.
// Advance the current position of the
// progress bar by the increment.
SendMessage(hwndPB, PBM_STEPIT, 0, 0);
} while (cb);
CloseHandle((HANDLE) hFile);
DestroyWindow(hwndPB);
return TRUE;
}
Progress bar controls in Microsoft Internet Explorer support the following new features.
| New Progress Bar Control Styles | Progress bar controls can now display progress information
vertically, using the |
|---|---|
| Extended Range Values | Progress bar controls now support 32-bit range values. To set range
values in excess of 65,535, use the |
| Programmable Colors | An application can now control the colors used in a progress bar
control with the |