使用进度条

【勇芳软件工作室】汉化HomePreviousNext

以下示例显示如何使用进度条来指示冗长的文件解析操作的进度。该示例创建一个进度条,并将其放置在父窗口的客户区域的底部。进度条的高度基于滚动条中使用的箭头位图的高度。该范围基于文件的大小除以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;

}