Direct Win32 API、奇妙な形のウィンドウ、そしてそれらの大半が消えた理由
(warped3.substack.com)- 現代の Windows アプリは Web ベースのフレームワーク依存 によって遅く重くなり、かつての Win32 時代にあった OS レベルの制御権 が失われた
- Win32 API では メッセージループと HRGN オブジェクト を通じてウィンドウの形を自由に定義でき、非標準のウィンドウデザイン が一般的だった
- ビットマップと レイヤードウィンドウ技術 を使えば、透明度やアニメーションを備えた 自由な形のウィンドウ を実装できた
- しかしカスタムウィンドウは、基本機能をすべて手動で実装しなければならない複雑さ と、ユーザーの シンプルさ志向への変化 によって次第に姿を消していった
- それでも Win32 は今なお ウィンドウ制御と実験の自由 を提供し、創造的なデスクトップソフトウェア制作の可能性 を保っている
現代 Windows アプリの単調さと Win32 が失った自由
- 最近の Windows デスクトップアプリの多くは、React、Electron、Tauri のようなブラウザラッパー上で動作しており、遅くメモリを過剰消費する 複雑な Web ベース構造 へと変わっている
- 単純なメモ帳ですら 50MB のメモリを占有する一方、純粋な Win32 C で書かれた同等機能のアプリは 1.8MB にすぎない
- 最新ハードウェアでも、Windows 11 の起動時にはメモリ使用率が 77% に達する
- かつて Win32 API を直接使ってプログラミングしていた時代には、OS レベルでの完全な制御権 を持てた
- 当時は四角いウィンドウに縛られず、非標準の形のウィンドウ を自由に作れた
- Windows XP 時代には、Windows Media Player をはじめとするさまざまなアプリが独特の外観を備えていた
かつて存在した「奇妙な形」のウィンドウたち
- かつての Windows アプリは、アイデンティティと個性 を表現するために多様な形で作られていた
- メディアプレーヤーはハードウェアのように見え、デスクトップマスコットが画面を歩き回り、ユーティリティパネルは 計器盤、おもちゃ、異星のコンソール のようにデザインされていた
- ウィンドウの形は四角形である必要がなく、UI の目的は使いやすさよりも個性 に近かった
- 今日こうした形が消えた理由は、プログラマーがもはやウィンドウそのものを制御していないから だ
- 現代の UI フレームワークの多くは OS を隠してしまい、開発者は制限された四角い領域の中でしか作業できない
Win32 のメッセージベース構造とウィンドウ制御
- Win32 プログラミングの中核は イベントメッセージループ にある
GetMessage、TranslateMessage、DispatchMessageから成るループが、すべての動作の基盤になる- “WM_CREATE”、“WM_PAINT”、“WM_SIZE”、“WM_DESTROY” などのメッセージを処理して、ウィンドウの挙動を定義する
- HRGN(リージョンオブジェクト) を使えば、ウィンドウの形を自由に変更できる
SetWindowRgnでウィンドウに領域を指定すると、その領域だけが実際のウィンドウとして認識される- サンプルコードでは
CreateEllipticRgnで楕円形のウィンドウを作り、タイトルバーがない状態でドラッグ機能を自前で実装 している - “WM_LBUTTONDOWN” 時に “WM_NCLBUTTONDOWN” を “HTCAPTION” として送ることで、ウィンドウ移動を擬似的に実現 する
- このように 形を作ること自体は簡単 だが、標準フレームが提供していた機能を自分で実装しなければならない点が本質的な課題となる
ビットマップベースのウィンドウとレイヤードウィンドウ
- “drivenbyimage/main.c” のサンプルでは、ビットマップデータでウィンドウの形を定義 している
- “shape.bmp” を読み込み、透明色(マゼンタ) を除いたピクセルをウィンドウ領域として設定する
- ビットマップは同時に 画面に描画される画像であり、ウィンドウの実際の形でもある
- かつてのスキン型アプリはこの方法で、子犬、宇宙船、ラジオ、キャラクターの顔 など多様な形を実現していた
- ただしビットマップベースの領域は、輪郭が硬く、半透明表現ができない
- 滑らかな縁やアニメーションのためには、レイヤードウィンドウ(WS_EX_LAYERED) が必要になる
- “Animated/” のサンプルでは、透明なアルファチャンネルを持つ 32 ビット画像 を
UpdateLayeredWindowでアップロードする- GDI+ でメモリ上のビットマップにスプライトシートを描画してフレームを切り替え、それをデスクトップ上に表示する
- ウィンドウの形は固定されているのではなく、現在のピクセル状態そのものがウィンドウの形 になる
- この方式は 滑らかな透明度、フレームごとの形状変化、自然なアニメーション をサポートする
カスタムウィンドウの難しさと文化的変化
- Win32 API でカスタムウィンドウを作ると、あらゆる細かな挙動を自分で処理しなければならない
- ドラッグ、リサイズ、閉じる操作、キーボード入力、DPI 対応など、標準ウィンドウが自動処理していた機能を手動で実装 する必要がある
- プロトタイプを作るのは簡単でも、完成度の高い製品へ磨き上げるには 大きなコストと労力 がかかる
- ユーザーはこうした視覚的実験よりも 安定性とシンプルさ を好むようになった
- 非標準ウィンドウはしばしば アドウェア、ツールバー、不要なユーティリティ と結び付けられ、否定的なイメージが生まれた
- その結果、「奇妙な形のウィンドウ」は 真面目なソフトウェアよりも遊び心のある要素 と見なされるようになった
Win32 に今なお残る可能性と意味
- それでも Win32 は今なお 直接制御と実験の自由 を提供している
- メッセージ、ハンドル、描画 API だけでも OS レベルのウィンドウ制御 が可能だ
- 多くの場合、四角いウィンドウは合理的だが、その形は選択にすぎず強制ではない ことを思い出させてくれる
- サンプルコードは GitHub リポジトリ WierdApps で公開されている
- 楕円形ウィンドウ、ビットマップベースのウィンドウ、アニメーションするマスコットの 3 つのサンプルを含む
- Win32 が今なお 創造的で実験的なデスクトップソフトウェア制作 を可能にしていることを示している
1件のコメント
Hacker Newsのコメント
奇妙な形のウィンドウは戻ってきてほしくない
作れるからといって、作るべきとは限らない
最近の React, Electron, Tauri のようなブラウザラッパーで作られたアプリがどれも似た見た目なのは、OS の GUI フレームワークを使っていないからだ
アプリがそれぞれ独自の 非標準ウィジェット や色、形を使うと、アクセシビリティと使いやすさが損なわれる
皮肉なことに、最近「アイデンティティ」を強調するアプリの大半は、ハードウェアメーカーが押し込んでくる ドライバー用コントロールパネル のようなもので、しかも最悪のブロートウェアだ
私は Win32 は好きだが、昔の奇妙なスキン文化は、今の「ブランディング = アイデンティティ」という考え方の前兆だったと思う
それが結局、Electron と中途半端なウィジェットライブラリ の乱立につながった
Blender や Ardour のような特殊なアプリでない限り、個性的な GUI は優先事項ではない
今の OS は個人向けではなく企業向けだ。Win3.1〜XP 時代 こそ本当のパーソナルコンピューティングの時代だった
最近の React ベースのアプリ は、OS とも、互いの間でも一貫性がない
6か月ごとに UI が変わるのに、UX は改善されない。アクセシビリティ(a11y)は完全に忘れ去られている
昔は少人数でソフトウェアを作り、長期間にわたって安定的に保守していた
今は高速な反復と大規模チーム中心に変わり、フラットデザイン はそうした環境に適応した結果だ
スキューモーフィックデザイン はアセットを作り直し続ける必要があり、コストが高い
結局、速度と規模 が優先される時代になった。まるで手彫りの家具の代わりに 平板な組み立て家具 が主流になったようなものだ
HiDPI 時代になって、昔のようにピクセル単位で UI を描くのは難しくなった
昔の Win95〜XP 時代は フロントバッファに直接描画して 高速でメモリ使用量も少なかったが、今は各ウィンドウごとにバックアップバッファを維持するため RAM をより多く使う
「The point was usually not usability. It was identity.」という文を見て、LLM が書いた文章 のように感じた
昔 Windows アプリを開発していたが、Win32 インターフェース は 90% 程度しか制御できなかった
カラーテーマを変えようとして、MessageBox を自分で再実装 しなければならなかった記憶がある
純粋な Win32 C で作られた Notepad は 1.8MB しか使わないのに、今どきのメモ帳は 50MB も使う
しかも GNU Emacs のほうがより少ないメモリで済む
一方、テキストモードの EDIT.EXE は 520KB しか使わず、はるかに効率的だ
以前、Mac 向けに Disco という CD 書き込みアプリがあったが、ディスクを書き込んでいる間、ウィンドウの上に 煙が立ち上るアニメーション が表示されていた
Steve Jobs がステージで直接見せながら気に入っていた
記事で デスクトップマスコット の話も出てきてうれしかった
最近、Godot で作られたデスクトップペットの動画 を見たが、クロスプラットフォームで動作する
少し手間はかかるが、Win32 レベルの複雑さではない。デスクトップペット愛好家 には良い選択肢だ