tools
読み取り中…
検索中…
一致する文字列を見つけられません
loadingTitle.h
[詳解]
1#pragma once
2#include <iostream>
3#include <string>
4#include <thread>
5#include <windows.h>
6
7/**
8 * @file loadingTitle.h
9 * @brief コンソールウィンドウタイトルにローディングアニメーションを表示するクラス
10 *
11 * Windows のコンソールウィンドウタイトルバーに □/■ を使った
12 * スロットアニメーションを別スレッドで描画します。
13 */
14
15/**
16 * @brief コンソールタイトルにローディングアニメーションを表示するクラス
17 *
18 * コンストラクタで別スレッドを起動し、タイトルバーに ■ が左右に動くアニメーションを描画します。
19 * stop() を呼ぶとアニメーションが停止し、インスタンスは自動で delete されます。
20 *
21 * @warning stop() を呼んだ後はポインタを使用しないでください(自動削除されます)
22 *
23 * @code
24 * auto* lt = new loadingTitle(5, 100); // 5マス、100ms間隔
25 * // ... 処理 ...
26 * lt->stop(); // アニメーション停止(ltはdeleteされる)
27 * @endcode
28 */
30public:
31 /**
32 * @brief コンストラクタ。別スレッドでアニメーションを開始する
33 * @param size アニメーションに使うマス(□/■)の数
34 * @param duration 1フレームの表示時間(ミリ秒)
35 */
36 loadingTitle(int size, int duration) {
37 std::thread([size,duration,this]{
38 char windowTitle[256];
39 GetConsoleTitle(windowTitle,256);
40 std::wstring loadTitle(size, L'□'); // サイズ分だけ初期化
41 int count = 0;
42
43 while (true) {
44 count %= size;
45
46 loadTitle[(count == 0 ? size - 1 : count - 1)] = L'□';
47 loadTitle[count] = L'■';
48
49 SetConsoleTitleW(loadTitle.c_str());
50 std::this_thread::sleep_for(std::chrono::milliseconds(duration));
51
52 ++count;
53 if (stopSignal) break;
54 }
55 delete this;
56 }).detach();
57 }
58
59 /**
60 * @brief アニメーションを停止する
61 * @note 停止後、スレッドが終了次第 delete this が実行されます
62 */
63 void stop() {stopSignal=true;}
64
65private:
66 /// @brief スレッド停止フラグ
67 bool stopSignal = false;
68};
loadingTitle(int size, int duration)
コンストラクタ。別スレッドでアニメーションを開始する
void stop()
アニメーションを停止する