直接Win32 API、奇妙な形のウィンドウ、そしてそれらがほとんど消えた理由
概要
- 現代のWindowsアプリは没個性で同質化
- 多くがElectronやTauriなどのWebラッパー利用
- Win32 APIによる自由なUI設計の価値
- カスタムウィンドウ実装例の紹介
- GitHubリポジトリにサンプルコード公開
現代Windowsアプリの画一化と不満
- ほとんどのWindowsデスクトップアプリがReact、Electron、TauriなどのWebラッパーで構築
- その結果、動作が遅く、メモリ消費が多い傾向
- NotepadやCalculatorなどのシンプルなアプリですら数十MBのメモリ消費
- かつてのWin32 C製アプリは1~2MB程度の軽量動作
- Windows 11起動直後でさえ大量のメモリ消費現象
- 最適化意識の低下とWeb開発者主導によるUI設計の単調化
Win32 APIによる自由なUI設計の魅力
- Win32 APIによる開発は完全なコントロールが可能
- XP時代には非標準ウィンドウや独自デザインが一般的
- Media Playerやデスクトップマスコットなど多様なウィンドウ形状
- 矩形ウィンドウ以外の形状も実現可能
- アイデンティティ重視のUI設計文化
Win32カスタムウィンドウ実装の基礎
- Win32プログラムはイベントメッセージ駆動型
- 例:
while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); }
- 例:
- WM_CREATE:ウィンドウ生成
WM_PAINT:再描画要求
WM_SIZE:サイズ変更
WM_DESTROY:終了処理 - ウィンドウの形状制御は**HRGN(Regionオブジェクト)**で実現
- 例:SetWindowRgnを使い楕円形ウィンドウを作成
region = CreateEllipticRgn(0, 0, rc.right, rc.bottom);SetWindowRgn(hwnd, region, TRUE);
- タイトルバー廃止時はドラッグ処理なども自前実装が必要
- 例:WM_LBUTTONDOWNでWM_NCLBUTTONDOWN/HTCAPTIONを送信
ビットマップやレイヤードウィンドウによる応用
- drivenbyimage/main.c:ビットマップ画像の形状に合わせてウィンドウ形状を決定
- Magenta(RGB(255,0,255))を透明色として扱う
- GetDIBitsでピクセル読み取り、透明でない部分をウィンドウ領域に
- Animated/:レイヤードウィンドウによるアニメーションマスコット実装
- WS_EX_LAYEREDウィンドウで32bitアルファ画像を表示
- UpdateLayeredWindowで毎フレーム画像更新
- GDI+利用でスプライトアニメーションを実現
- ピクセル単位の透過やソフトなエッジが可能
カスタムウィンドウの課題と文化の変化
- Win32 APIでのカスタムウィンドウは全責任が開発者側
- ドラッグ、リサイズ、クローズ、ヒットテスト、DPI対応など全て自作
- プロトタイプは簡単だが製品レベルの仕上げは困難
- 奇抜なウィンドウはアドウェアやツールバーのイメージ悪化で衰退
- 信頼性重視・シンプルなUI志向への文化転換
- それでもWin32 APIは今も自由なUI表現を可能にする環境
まとめとGitHubリポジトリ案内
- Win32 APIは自由なウィンドウ設計を今もサポート
- 矩形ウィンドウは「選択肢」であり「制約」ではない
- GitHubリポジトリでサンプルコードを公開中
- 興味があればリポジトリ参照推奨