Индикаторы выполнения — это ценный визуальный элемент в программных приложениях, который в режиме реального времени предоставляет пользователям информацию о ходе выполнения задачи. В этой статье мы рассмотрим различные методы создания индикатора выполнения в C++. Мы рассмотрим подходы как с использованием консоли, так и с использованием графического пользовательского интерфейса (GUI) с примерами кода для каждого метода.
Метод 1: индикатор выполнения на консоли
Давайте начнем с простого индикатора выполнения на консоли. Этот метод включает обновление вывода консоли для визуального отображения прогресса.
#include <iostream>
#include <windows.h> // for Sleep function
void updateProgressBar(int progress, int total) {
const int barWidth = 70;
float percent = (float)progress / total;
int progressWidth = barWidth * percent;
std::cout << "[";
for (int i = 0; i < progressWidth; ++i) {
std::cout << "=";
}
std::cout << ">" << std::string(barWidth - progressWidth, ' ') << "]";
std::cout << " " << int(percent * 100.0) << "%\r";
std::cout.flush();
}
int main() {
const int totalIterations = 100;
for (int i = 0; i <= totalIterations; ++i) {
updateProgressBar(i, totalIterations);
Sleep(100); // Simulate some work being done
}
return 0;
}
Метод 2: индикатор выполнения на основе графического интерфейса с использованием библиотеки (SFML)
Чтобы создать графический индикатор выполнения, мы можем использовать такую библиотеку, как SFML (простая и быстрая мультимедийная библиотека).
#include <SFML/Graphics.hpp>
int main() {
sf::RenderWindow window(sf::VideoMode(400, 200), "Progress Bar");
sf::RectangleShape progressBar(sf::Vector2f(0, 20));
progressBar.setFillColor(sf::Color::Green);
const int totalIterations = 100;
for (int i = 0; i <= totalIterations; ++i) {
progressBar.setSize(sf::Vector2f(i * 4, 20));
window.clear();
window.draw(progressBar);
window.display();
sf::sleep(sf::milliseconds(100)); // Simulate some work being done
}
return 0;
}
Метод 3: индикатор выполнения на основе графического интерфейса без внешних библиотек
Если вы предпочитаете не использовать внешние библиотеки, вы можете создать индикатор выполнения, используя собственные среды графического пользовательского интерфейса, такие как WinAPI или Qt. Вот пример использования WinAPI:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
static int progressBarWidth = 0;
const int totalIterations = 100;
switch (msg) {
case WM_CREATE: {
CreateWindowEx(0, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE, 50, 50, 300, 25, hwnd, NULL, NULL, NULL);
SetTimer(hwnd, 1, 100, NULL); // Timer to update progress
break;
}
case WM_TIMER: {
progressBarWidth += 3;
if (progressBarWidth > 300) {
progressBarWidth = 300;
KillTimer(hwnd, 1); // Stop the timer
}
SendMessage(GetDlgItem(hwnd, 0), PBM_SETPOS, progressBarWidth, 0);
break;
}
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
const wchar_t className[] = L"Progress Bar Window";
WNDCLASSEX wc = {0};
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = className;
RegisterClassEx(&wc);
HWND hwnd = CreateWindowEx(0, className, L"Progress Bar", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 150, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
В этой статье мы рассмотрели три различных метода создания индикатора выполнения в C++. Первый метод продемонстрировал консольный подход, тогда как второй и третий методы были ориентированы на индикаторы выполнения на основе графического пользовательского интерфейса с использованием библиотек (SFML) и собственных платформ (WinAPI) соответственно. Индикаторы выполнения необходимы для предоставления пользователям визуальной обратной связи во время длительных задач. Реализуя эти методы, вы можете улучшить взаимодействие с пользователем и повысить общее удобство использования ваших приложений C++.