21xrx.com
2024-12-22 21:34:49 Sunday
登录
文章检索 我的文章 写文章
C++如何简单实现进度条功能?
2023-07-06 13:13:07 深夜i     --     --
C++ 进度条 简单 实现 功能

在软件开发中,进度条是很重要的一个功能,它可以让用户在等待某个任务执行完毕时知道进度,从而提高整个软件使用的体验。C++语言可以通过简单的代码实现进度条功能,以下是一些实现方式。

方法一:使用Windows API

Windows API中提供了一个Progress Bar(进度条)控件,可以通过调用它的函数来实现进度条的功能。在C++中,这个控件可以通过创建窗口的方式来使用。

示例代码:


#include <windows.h>

// 定义进度条控件ID

#define IDC_PROGRESS 1001

// 窗口过程

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

  static HWND hProgress;

  switch (msg)

  {

    case WM_CREATE:

      // 创建进度条控件

      hProgress = CreateWindowExW(0, PROGRESS_CLASSW, NULL, WS_CHILD | WS_VISIBLE, 10, 10, 200, 20, hWnd, (HMENU)IDC_PROGRESS, GetModuleHandle(NULL), NULL);

      SetWindowTextW(hWnd, L"C++ Progress Bar");

      break;

    case WM_COMMAND:

      break;

    case WM_DESTROY:

      PostQuitMessage(0);

      break;

    default:

      return DefWindowProc(hWnd, msg, wParam, lParam);

  }

  return 0;

}

// 主函数

int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)

{

  // 注册窗口类

  WNDCLASSEX wcex = { 0 };

  wcex.cbSize = sizeof(WNDCLASSEX);

  wcex.style = CS_HREDRAW | CS_VREDRAW;

  wcex.lpfnWndProc = WndProc;

  wcex.hInstance = hInstance;

  wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);

  wcex.lpszClassName = L"MainWindowClass";

  RegisterClassEx(&wcex);

  // 创建窗口

  HWND hWnd = CreateWindowExW(0, L"MainWindowClass", L"C++ Progress Bar", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, nullptr, nullptr, hInstance, nullptr);

  // 显示窗口

  ShowWindow(hWnd, nCmdShow);

  UpdateWindow(hWnd);

  // 更新进度条

  int iPos = 0;

  while (iPos <= 100)

  {

    SendDlgItemMessage(hWnd, IDC_PROGRESS, PBM_SETPOS, iPos, 0);

    iPos += 1;

    Sleep(100);

  }

  // 消息循环

  MSG msg;

  while (GetMessage(&msg, nullptr, 0, 0))

  {

    TranslateMessage(&msg);

    DispatchMessage(&msg);

  }

  return (int)msg.wParam;

}

方法二:使用字符打印方式

另一种简单的实现方式是使用字符打印,可以在控制台中实现进度条功能。

示例代码:


#include <iostream>

#include <windows.h>

using namespace std;

int main()

{

  // 设置光标隐藏

  HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

  CONSOLE_CURSOR_INFO cci;

  GetConsoleCursorInfo(hOut, &cci);

  cci.bVisible = false;

  SetConsoleCursorInfo(hOut, &cci);

  // 打印进度条

  for (int i = 0; i <= 100; i++)

  {

    cout << "[";

    for (int j = 0; j < i; j++)

    

      cout << "=";

    

    for (int j = i; j < 100; j++)

    

      cout << " ";

    

    cout << "] " << i << "%" << flush;

    Sleep(100);

    cout << "\r";

  }

  // 恢复光标

  cci.bVisible = true;

  SetConsoleCursorInfo(hOut, &cci);

  return 0;

}

总结

通过以上两种方式,我们可以在C++中实现简单的进度条功能。第一种方式需要使用Windows API,需要一些基本的Windows编程知识,但可以实现比较漂亮的效果;第二种方式简单易懂,但在控制台中绘制的进度条样式可能不如第一种方式丰富。开发者可以根据实际情况选择适合自己的方式。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复