c 进度条教程:为您的应用程序添加动态进度反馈 (vc进度条)

淘宝闪购红包搜88744,有25元大红包

👇复制口令打开淘宝免单奶茶和25红包👇

¥XT7U4sdjF9I¥/ HU7405

进度条教程

进度条是应用程序中常用的控件,用于向用户提供有关操作进度的视觉反馈。在本章中,您将学习如何使用 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:”, –


宫下动漫

© 版权声明

相关文章