世界を動かす技術を、日本語で。

直接Win32 API、奇妙な形のウィンドウ、そしてそれらがほとんど消えた理由

概要

  • 現代のWindowsアプリは 没個性 で同質化
  • 多くが ElectronやTauri などのWebラッパー利用
  • Win32 API による自由なUI設計の価値
  • カスタムウィンドウ 実装例の紹介
  • GitHubリポジトリ にサンプルコード公開

現代Windowsアプリの画一化と不満

  • ほとんどのWindowsデスクトップアプリが React、Electron、Tauri などのWebラッパーで構築
  • その結果、 動作が遅く、メモリ消費が多い 傾向
  • NotepadCalculator などのシンプルなアプリですら 数十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_LBUTTONDOWNWM_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リポジトリサンプルコード を公開中
  • 興味があればリポジトリ参照 推奨

Hackerたちの意見

ポイントは通常、使いやすさじゃなくて、アイデンティティだったんだよね。これを読んで「これ、LLMが書いたんじゃない?」って思ったのは悪いことなのかな。

まったく同感だわ。でも、著者が何か言いたかったのも分かるし、最終的にはうまく伝わってる。最初は愚痴みたいな感じだけど、面白い例に繋がって、過去にやったことを思い出させてくれる。

この記事のすべての行はLLMによって書かれたんだ…

うん、変な形のウィンドウは絶対に復活すべきじゃないよね。できるからって、やるべきとは限らない。 > 今のところ、すべてのWindowsデスクトップアプリは同じに見えるし、同じものだからね。クソみたいなReactやElectron、electronbun、Tauriのブラウザラッパーで作られて、本物のデスクトップアプリを真似てるだけ。デスクトップアプリはOSのGUIフレームワークを使うべきだから、見た目は同じであるべきだよ。ReactやElectronとは関係ない。 この議論はちょっと理解できないな。ウェブビューに基づいているから、アプリケーションはウェブサイトのように異なる見た目になるはずなのに、似ているのは良いことだと思う。 > ポイントは通常、使いやすさじゃなくて、アイデンティティだったんだよね。そうそう。使いやすさも大事だし。独自のウィジェットやカラースキーム、非標準の形を実装しているアプリは、使いやすさやアクセシビリティに全く気を使ってないことが多い。ほとんどの場合、標準的な配慮が欠けていて、UXガイドラインも無視してるし。皮肉なことに、今の「アイデンティティ」が最も強いアプリは、HWメーカーの制御パネルやデバイスドライバーにバンドルされたアクセサリーで、平均的なユーザーが遭遇する最もクソなブloatwareだったりする。

どうだろう。見た目はかっこいいよね。誰かが復活させたいなら、それはアリだと思う。私は全然歓迎するよ。

アクセシビリティもすごく重要だよね。ここでも人々の権利を守るための法律や規制があるし。現代のクロスプラットフォームGUIフレームワーク(どんなに重くても)は、視覚に障害のある人たちのためにスクリーンリーダーやHiDPIをサポートするのに問題ないし。

ReactやElectronとは関係ない話だね。それだけじゃなくて、Electronは逆の問題を引き起こすと思う。全てのアプリが見た目も動作もバラバラで、プラットフォームのガイドラインに従ってないし、場違いに見えるんだよね。

その通り。みんながUIデザインで「自分のスタイルを出そう」としてた時代は、あんまり快適でも使いやすくもなかったよね。例えば、これらのデザインを見てみてよ。http://hallofshame.gp.co.at/mshame.htm

同意。Vistaの頃には、特にMicrosoftがWindows Presentation Foundationフレームワークを大々的に宣伝してXAMLを使ってUIデザインしてた時期に、かなりの数の非標準デザインを見た記憶がある。こういうセットアップの問題は、サイズを変更したり、特定の場所に配置したり、大きいモニターや小さいモニターに移動したりする必要が出てきた瞬間、スケールがひどくなって、「千の傷による死」のような問題を引き起こすことだね。

それに、その発言は間違ってるよね。Windowsアプリは同じに見えないし、それは悪いことだ。ああ…タイトルバーがないせいで、どのアプリを見ているのかもわからない。これ、Edgeで開いてるPDFなのか、Acrobatなのか?誰にもわからないよ。ウィンドウは同じに見えるし、その先は…本当にひどい混乱だよ。メニューバーがないアプリがあって、代わりにハンバーガーボタンや「ギア」ボタンが散らばってる。さらに、「ファイルを保存」といった一般的な機能も、そういうメニューの中で「もっと見る」ってラベルの後ろに隠されてる。Windowsのひどい後退のもう一つの例は、多くのアプリでファイルダイアログが廃止されて、代わりに粗雑に描かれたラベルのない超広いテキストボックスと普通のテキストのページに置き換えられていることだ。ファイル構造が表示されないから、どこにファイルを保存するのか全くわからない…本当にクソみたいなUIの見本だね。情けない。

うん、変な形の窓は復活させるべきじゃないよね。できるからって、やるべきとは限らない。俺の意見は君とは真逆だよ。コンピューターをかっこよく戻そうぜ!昔はエイリアンの宇宙船みたいだったのに、今は全部書類みたいになっちゃった。もう一度かっこよくできるはず!楽しさを取り戻そう。人生の楽しい部分は選択肢なんだから。

スチームには「デスクトップゲーム」の波が来てるね。ほとんどがアイドルジャンルかたまごっちみたいなやつ。そういうのには、こういうエキゾチックな形の窓が楽しくて、いい差別化になると思うよ。例: https://store.steampowered.com/app/2666510/Rustys_Retirement... たくさんのゲームが入ったバンドル: https://store.steampowered.com/bundle/48558/BottomOfYourScre...

Hacker Newsで議論の続きを見る