【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; // 非サポート }
参考
DwmSetWindowAttribute 関数 (dwmapi.h) - Win32 apps Microsoft Learn
https://learn.microsoft.com/ja-jp/windows/win32/api/dwmapi/nf-dwmapi-dwmsetwindowattributeデスクトップ アプリケーションで角の丸めを適用する - Windows apps Microsoft Learn
https://learn.microsoft.com/ja-jp/windows/apps/desktop/modernize/apply-rounded-cornersWindows 11でのウィンドウの形状とコントロールの形状 #2 – nishy software (ja)
https://nishy-software.com/ja/dev-sw/windows-11-ui-design-2/
【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);
参考
- FlashWindowEx 関数 (winuser.h) - Win32 apps Microsoft Learn
https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-flashwindowex - c# - Window application flash like orange on taskbar when minimize - Stack Overflow
https://stackoverflow.com/questions/11309827/window-application-flash-like-orange-on-taskbar-when-minimize
【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; }
参考
Windows10 で、初代 MOTU UltraLite を使う(ドライバーのインストール)
はじめに
ドライバーを見つけられなくて、インストールに躓いたので簡単にメモを残しておく。
公式トップに出てくるページから、UltraLite (含む古い製品)を選択すると Firmware 項目しか出てこないけど、
サポートページの方に、置いてあるよという話。
環境
インストール方法
(2ステップだけ)
下記ページから「MOTU Universal Audio Installer for Windows (4.0.5.9198)」を探して、「MUAI_Win_59198.zip」を入手
https://motu.com/techsupport/technotes/download/download_matching_downloads.htmlzipを適当な場所に展開して「SetupAudio.exe」を実行
- インストール時、特に互換設定は必要なかった。
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 API のLoadBitmap
等、
何かしらのリソースとして4bit深度のビットマップイメージが使いたい時、
「ImageMagick」と「ペイント(mspaint)」を使って作成する例。
ImageMagick の入手
今回は、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標準の「ペイント」に読み込ませて、
「上書き保存」することで、解決する。