イネマルのプログラミング備忘録

趣味プログラマのメモ

【WinAPI】C++ Windows11 環境でウィンドウの角丸を制御する

ウィンドウの角丸を制御する

Windows11 から、デフォルトでウィンドウの四つ角が丸められます。
これを、Windows10 のような丸められていない状態などに変更するには、DwmSetWindowAttribute を使用します。
Windows11 以降で利用可能 な方法です。それ以前の古い環境で、APIは動作しません。

実装

ウィンドウハンドルを指定してAPIを呼び出すだけで変更できます。

インクルード周り

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <dwmapi.h>
#pragma comment(lib, "dwmapi.lib")

角丸の種類と呼び出し方

// 例:ウィンドウの角を丸めない
static const auto attr = DWMWA_WINDOW_CORNER_PREFERENCE;
static const auto pref = DWMWCP_DONOTROUND;
::DwmSetWindowAttribute(hWnd, attr, &pref, sizeof(pref));

pref の値は、下記を参照。

列挙値 説明
DWMWCP_DEFAULT ウィンドウの角を丸めるかどうかをシステムに決めさせます。
DWMWCP_DONOTROUND ウィンドウの角は丸められません。
DWMWCP_ROUND 必要に応じて、角を丸めます。
DWMWCP_ROUNDSMALL 必要に応じて角を丸め、半径を小さくします。

その他

DWM をサポートしている環境かどうかのチェック処理は下記の通り。
(現行環境では、呼び出す必要はないはず。)

BOOL isDwmEnable = FALSE;
auto hResult = ::DwmIsCompositionEnabled(&isDwmEnable);
if (hResult != S_OK || isDwmEnable == FALSE) {
    return; // 非サポート
}

参考

【WinAPI】C++ ウィンドウの背景色を取得する方法

メモ

ウィンドウクラスの登録時に指定する、背景色ブラシからRGBカラーを取り出す。

実装

auto hb = reinterpret_cast<HBRUSH>(::GetClassLong(m_hWnd, GCL_HBRBACKGROUND));
LOGBRUSH br{};
if (::GetObject(hb, sizeof(br), &br)) {
    BYTE r = GetRValue(br.lbColor);
    BYTE g = GetGValue(br.lbColor);
    BYTE b = GetBValue(br.lbColor);
}

【WinAPI】C++ タスクバーのアイコンを強調表示する(FlashWindowEx)

メモ

ウィンドウを最小化している時など、ウィンドウを表示していない時に、
ユーザーに処理の完了を通知するにはタスクバーアイコンを強調表示します。
これは、FlashWindowEx を使用して実現します。(Windows10 では、オレンジ色に光ります。)

実装

// 適当なウィンドウハンドル
auto hWnd = ::FindWindow(nullptr, TEXT("無題 - ペイント"));
FLASHWINFO fInfo{
    sizeof(FLASHWINFO),
    hWnd,
    FLASHW_TRAY | FLASHW_TIMERNOFG
};
::FlashWindowEx(&fInfo);

参考

【WinAPI】C++ ウィンドウの最小サイズと最大サイズを取得する(WM_GETMINMAXINFO)

メモ

ウィンドウメッセージ「WM_GETMINMAXINFO」を、目的のウィンドウに送信して取得する。
ウィンドウのサイズ制御は、アプリ毎に実装が異なるので、
ウィンドウ側がメッセージを処理していない場合には、取得できないことに注意する。

実装

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
    // 適当なウィンドウハンドル
    auto hWnd = ::FindWindow(nullptr, TEXT("Microsoft Visual Studio"));

    // 最小・最大サイズを取得
    MINMAXINFO mmInfo{};
    ::SendMessage(hWnd, WM_GETMINMAXINFO, 0, reinterpret_cast<LPARAM>(&mmInfo));
    
    // 最小サイズ
    mmInfo.ptMinTrackSize.x;
    mmInfo.ptMinTrackSize.y;

    // 最大サイズ
    mmInfo.ptMaxTrackSize.x;
    mmInfo.ptMaxTrackSize.y;

    return 0;
}

参考

social.msdn.microsoft.com

【Windows】Aeroシェイク のみ無効化する(Aeroスナップ は有効)

メモ

Aeroスナップは多用するけど、Aeroシェイクを誤爆しがちなので、
シェイクの方だけ無効化したい。
これは、レジストリの設定で対応可能。

レジストリの設定

.reg ファイル(UTF-16 with BOM)を作って実行するだけ。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer]
"NoWindowMinimizingShortcuts"=dword:00000001

参考

admx.help

Windows10 で、初代 MOTU UltraLite を使う(ドライバーのインストール)

はじめに

ドライバーを見つけられなくて、インストールに躓いたので簡単にメモを残しておく。
公式トップに出てくるページから、UltraLite (含む古い製品)を選択すると Firmware 項目しか出てこないけど、
サポートページの方に、置いてあるよという話。

環境

インストール方法

(2ステップだけ)

MOTU Audio Installer の対象製品

レガシープロダクトの一覧は、下記ページから確認できる。
https://motu.com/techsupport/technotes/motu-audio-installer-and-legacy-products

  • 1224
  • 1296
  • 2408
  • 2408mkII
  • 2408mk3
  • 24i
  • 24I/O
  • 308
  • 828
  • 828mkII FW/USB
  • 828mk3
  • 896
  • 896HD
  • 896mk3 FW
  • HD192
  • MicroBook
  • MicroBook II
  • Traveler
  • UltraLite
  • UltraLite-mk3 FW

おわりに

初代 UltraLite がタダ同然で入手できたので、サブPCでDACとして使おうとしたのが発端。
IEEE1394をサポートしたマザーボードは、おそらく絶滅しているので、PCIかPCIEで増設することになるのだけど、
調べてみると、どうやらここにも落とし穴があるらしい。

自分の環境では、すんなり動いてしまったが、

といった話が見つかる。
USB2.0V+1394V-PCI は、VIA製だが、ひとまず報告されているような問題は確認できなかった。

以上。

ImageMagick で、画像を 4bit深度 bmp に変換する(減色)

メモ

Windows APILoadBitmap等、
何かしらのリソースとして4bit深度のビットマップイメージが使いたい時、
ImageMagick」と「ペイント(mspaint)」を使って作成する例。

ImageMagick の入手

ImageMagick - Download

今回は、Portable版を使う。(ImageMagick-7.0.10-59-portable-Q16-x64.zip)

変換方法

例では、ImageMagick をCドライブ直下に保存(解凍)。

コマンドは、下記の通り。

"C:\ImageMagick-7.0.10-59-portable-Q16-x64\convert" "変換元の画像パス" -depth 4 "保存先パス(拡張子.bmp)"

変換された bmp を右クリックして、
「プロパティ」「詳細」タブの「ビットの深さ」が4になっていることを確認して完了。

この時、「ビットの深さ」が4にならない場合は、
4bit深度 png を経由すると変換できる事がある。

"C:\ImageMagick-7.0.10-59-portable-Q16-x64\convert" "変換元の画像パス" -depth 4 "一時保存先パス(拡張子.png)"
"C:\ImageMagick-7.0.10-59-portable-Q16-x64\convert" "一時保存先パス(拡張子.png)" -depth 4 "4bit bmp 保存先パス"

Visual Studio のリソースエディタで読めるようにする

ImageMagick の変換だけでは、何故か Visual Studio のリソースエディタで、
「認識できないビットマップ形式です。」とエラー表示が出る。

これは、Windows標準の「ペイント」に読み込ませて、
「上書き保存」することで、解決する。

参考