ウィイイイイイッス!まぁ今日はー、バレンタイン当日ですけどもー、
チョコレートは…誰一人貰えませんでした…

それはさておき、2週間もブログの更新が空いてしまいすみませんでした。
今日、Albus Boxのベータ版ver.0.1.2を公開しましたので、その更新内容に関する話を書いておきます。

新機能

最前面表示(Windows版のみ)

最前面に固定して表示できるようになりました。ただしWin32APIを使用していますので、Windows版のみ。
SnapCrab_NoName_2022-2-14_22-39-43_No-00

ウィンドウ右上、×ボタンの隣りにあるピンマークのボタンを押すと、最前面表示が有効になります。もう一度押すと無効になります。

動作の中身の話をしますと、最前面表示を有効にするには、Win32APIのSetWindowPos()を用いて以下のようにします。

SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);

hWndがウィンドウハンドルです。第2引数のHWND_TOPMOSTオプションが最前面表示の有効化を示すフラグです。
SetWindowsPos()はウィンドウのサイズや位置を変更するためのメソッドですが、第7引数にオプションとしてSWP_NOMOVESWP_NOSIZEを指定することで、SetWindowPos()を呼び出したときにウィンドウの移動やリサイズを伴わないようにしています。

無効化するときは第2引数にHWND_NOTOPMOSTを指定します。

SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);

バグ修正など

実行中のdpi変更への対応(Windows版のみ)

Mac版やLinux版ではWin32APIを使っておらず、dpi変更への特別な対応は必要ないためWindows版のみ。
高dpi環境で表示がバグる問題は現時点の最新版のver.0.1.1で解決済みですが、起動時のdpi値を基にウィンドウサイズを設定しているため、実行中にdpiが変更された場合でも自動で適切なサイズに変更するようにしました。

#define DPI_STANDARD	96

double before_dpi_dist = 0.0;
HWND hWnd = 0;

// 中略

double specific::getDpiDist() {
	return (double)GetDpiForWindow(hWnd) / DPI_STANDARD;
}

bool specific::setWindowStyle(int x1, int y1, int x2, int y2, int w, int h) {
	// ウィンドウハンドルを取得(Siv3D)
	if (hWnd == 0) {
		hWnd = static_cast<HWND>(s3d::Platform::Windows::Window::GetHWND());
	}

	double dpi_dist = getDpiDist();
	if (dpi_dist == before_dpi_dist) {  // ここでdpi値の変化をチェック
		return false;
	}
	before_dpi_dist = dpi_dist;

	// 角丸長方形の生成
	auto hRegion = CreateRoundRectRgn(x1, y1, x2 * dpi_dist, y2 * dpi_dist, w, h);
	// 角丸長方形をウィンドウの形に適用
	SetWindowRgn(hWnd, hRegion, 1);

	return true;
}

仕組みはいたって単純で、毎フレームdpi値を取得し、dpi値が変わっていたら適切なサイズに変更するという仕様。ただ、実行中にdpi値が変更されることは少ないですし、毎フレームAPIを呼び出すのはよろしくない気がするので、今後は数フレーム(あるいは数秒)に1度だけdpiの変更の有無の検知をするように変更する予定です。

プレイリストで画面外のボタンが操作できるバグの修正

プレイリスト画面でスクロールしたとき、ウィンドウ上部のボタンが隠れる部分でボタンが操作できてしまう問題を修正しました。
SnapCrab_Albus Box_2022-2-14_2-31-51_No-00 - コピー
ver.0.1.1以前では、スクロールによって赤枠で囲った部分に来た再生ボタンが操作可能でした。

Loading表示のバグ修正

大したバグではありませんが、ファイルを開いた後、別のファイルを開くと、元々開いていたファイルのファイル名の上に「Loading…」と重なって表示される問題を修正しました。

ダウンロード

https://github.com/YotioSoft/Albus-Box/releases/tag/ver.0.1.2(Beta3)

今後の予定

次は歌詞表示機能を実装したいなと考えています。Gamut Boxにもあったやつですね。
歌詞を表示する場所ですが、スペクトルが表示される部分に歌詞を表示させたいと考えています。
SnapCrab_Albus Box_2022-2-14_2-31-36_No-00 - コピー

歌詞を表示させること自体は別に難しくないけれども、歌詞を設定する画面をどのように作るか悩み中。リスト形式で表示して、項目一つ一つをマウス操作でドラッグアンドドロップで並び替えられるようにしたいなーと思ってます。ちょっと難しそう。