概要
- 現代の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リポジトリ で サンプルコード を公開中
- 興味があればリポジトリ参照 推奨