以下示例显示如何使用进度条来指示冗长的文件解析操作的进度。该示例创建一个进度条,并将其放置在父窗口的客户区域的底部。进度条的高度基于滚动条中使用的箭头位图的高度。该范围基于文件的大小除以2048,这是从文件读取的每个“块”的大小。该示例还设置了一个增量,并在解析每个块之后将进度条的当前位置提前了增量。
// ParseALargeFile - 解析大文件并使用进度条
//指示解析操作的进度。
//如果成功返回TRUE,否则返回FALSE。
// hwndParent - 进度条的父窗口
// lpszFileName - 要解析的文件的名称
//
//全局变量
// g_hinst - 实例句柄
extern HINSTANCE g_hinst;
BOOL ParseALargeFile(HWND hwndParent, LPSTR lpszFileName)
{
RECT rcClient; //父窗口的客户区
int cyVScroll; //滚动条箭头的高度
HWND hwndPB; //进度条的句柄
HANDLE hFile; //文件的句柄
DWORD cb; //文件大小和读取的字节数
LPCH pch; //从文件读取的数据地址
LPCH pchTmp; //临时指针
//确保加载公共控件DLL并创建一个
//进度条沿着客户端的底部
//父窗口基于进度条的高度
//滚动条箭头的高度。
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);
//打开文件进行阅读,并检索文件的大小。
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);
//设置进度条的范围和增量。
SendMessage(hwndPB, PBM_SETRANGE, 0, MAKELPARAM(0, cb / 2048));
SendMessage(hwndPB, PBM_SETSTEP, (WPARAM) 1, 0);
//解析文件。
pch = (LPCH) LocalAlloc(LPTR, sizeof(char) * 2048);
pchTmp = pch;
do {
ReadFile(hFile,pchTmp,sizeof(char)* 2048,& cb,
(LPOVERLAPPED) NULL);
.
. //在此包含任何解析文件的代码。
.
//提前进度条的当前位置
//通过增量。
SendMessage(hwndPB, PBM_STEPIT, 0, 0);
} while (cb);
CloseHandle((HANDLE) hFile);
DestroyWindow(hwndPB);
return TRUE;
}