
进度条是应用程序中常用的控件,用于向用户提供有关操作进度的视觉反馈。在本章中,您将学习如何使用 C 语言创建和管理进度条。
创建进度条
要创建进度条,可以使用
CreateWindowEx()
函数。该函数需要以下参数:
dwExStyle
:窗口扩展样式。对于进度条,应使用
WS_EX_STATICEDGE
样式。
lpClassName
:窗口类名。对于进度条,应使用
PROGRESS_CLASS
。
lpWindowName
:窗口名称。这可以是任何您喜欢的字符串。
dwStyle
:窗口样式。对于进度条,应使用
WS_CHILD | WS_VISIBLE
样式。
x
:进度条窗口的 x 坐标。
y
:进度条窗口的 y 坐标。
nWidth
:进度条窗口的宽度。
nHeight
:进度条窗口的高度。
hWndParent
:进度条窗口的父窗口句柄。
hMenu
:进度条窗口的菜单句柄。如果不需要菜单,则应将此参数设置为
NULL
。
hInstance
:应用程序实例句柄。
lpParam
:传递给窗口过程的附加数据。对于进度条,这通常设置为
NULL
。
以下代码示例展示如何创建进度条:
c
HWND hProgressBar = CreateWindowEx(WS_EX_STATICEDGE, PROGRESS_CLASS, “My ProgressBar”, WS_CHILD | WS_VISIBLE, 100, 100, 200, 20, hWndParent, NULL, hInstance, NULL);
设置进度条范围
创建进度条后,您需要设置其范围。范围指定进度条的最小值和最大值。可以通过
SetRange()
函数设置范围。该函数需要以下参数:
hWnd
:进度条窗口句柄。
nMinRange
:进度条的最小值。
nMaxRange
:进度条的最大值。
以下代码示例展示如何设置进度条的范围:
c
SetRange(hProgressBar, 0, 100);
设置进度条位置
设置进度条的范围后,您可以设置其位置。位置表示进度条已完成的百分比。可以通过
SetPos()
函数设置位置。该函数需要以下参数:
hWnd
:进度条窗口句柄。
nPos
:进度条已完成的百分比。
以下代码示例展示如何设置进度条的位置:
c
SetPos(hProgressBar, 50);
处理进度条消息
进度条窗口接收各种消息,包括
WM_PAINT
、
WM_SIZE
和
WM_LBUTTONDOWN
。您需要在窗口过程中处理这些消息以更新进度条的外观和行为。
WM_PAINT
消息在进度条需要重绘时发送。在处理此消息时,您应该使用
FillRect()
函数填充进度条的客户区域。以下代码示例展示如何处理
WM_PAINT
消息:
c
case WM_PAINT:{PAINTSTRUCT ps;HDC hdc = BeginPaint(hWnd, &ps);FillRect(hdc, &ps.rcPaint,(HBRUSH) (COLOR_WINDOW + 1));EndPaint(hWnd, &ps);}break;
WM_SIZE
消息在进度条窗口大小更改时发送。在处理此消息时,您应该更新进度条的客户区域大小。以下代码示例展示如何处理
WM_SIZE
消息:
c
case WM_SIZE:{RECT rcClient;GetClientRect(hWnd, &rcClient);SetWindowPos(hProgressBar, NULL, rcClient.left, rcClient.top, rcClient.right – rcClient.left, rcClient.bottom – rcClient.top, SWP_NOZORDER | SWP_NOACTIVATE);}break;
WM_LBUTTONDOWN
消息在用户单击进度条时发送。在处理此消息时,您应该设置进度条位置为鼠标指针的位置。以下代码示例展示如何处理
WM_LBUTTONDOWN
消息:
c
case WM_LBUTTONDOWN:{int x = LOWORD(lParam);int y = HIWORD(lParam);SetPos(hProgressBar, x);}break;
示例应用程序
以下是一个示例应用程序,展示了如何使用 C 语言创建和管理进度条:
c
include
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{WNDCLASSEX wc;wc.cbSize = sizeof(WNDCLASSEX);wc.style = 0;wc.lpfnWndProc = WindowProc;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = hInstance;wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);wc.hCursor = LoadCursor(NULL, IDC_ARROW);wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;wc.lpszClassName = “My Window Class”;wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);if (!RegisterClassEx(&wc)){MessageBox(NULL, “Failed to register window class.”, “Error”, MB_OK | MB_ICONERROR);return 0;}HWND hWnd = CreateWindowEx(0, wc.lpszClassName, “My Application”, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 480, 320, NULL, NULL, hInstance, NULL);if (hWnd == NULL){MessageBox(NULL, “Failed to create window.”, “Error”, MB_OK | MB_ICONERROR);return 0;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{static HWND hProgressBar;switch (uMsg){case WM_CREATE:hProgressBar = CreateWindowEx(WS_EX_STATICEDGE, PROGRESS_CLASS, “My ProgressBar”, WS_CHILD | WS_VISIBLE, 100, 100, 200, 20, hWnd, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL);if (hProgressBar == NULL){MessageBox(hWnd, “Failed to create progress bar.”, “Error”, MB_OK | MB_ICONERROR);return -1;}SetRange(hProgressBar, 0, 100);SetPos(hProgressBar, 50);break;case WM_PAINT:{PAINTSTRUCT ps;HDC hdc = BeginPaint(hWnd, &ps);FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW + 1));DrawText(hdc, “Progress:”, –
宫下动漫
© 版权声明
文章版权归作者所有,未经允许请勿转载。









