ダイアログマネージャーの自己終了方法のカスタマイズ: Close経路の分離
メッセージループの流れをインターセプトし、ダイアログマネージャーの終了方法をカスタマイズする方法について説明しています。
キーポイント
ダイアログマネージャーの閉じる動作をカスタマイズする方法を解説
WM_SYSCOMMAND/SC_CLOSEとWM_COMMAND/BN_CLICK/IDCANCELの信号経路の違いを図解
CloseボタンとESCキー、Cancelボタンを個別に制御する実装手法を提供
影響分析・編集コメントを表示
影響分析
この記事はWindowsダイアログプログラミングの実践的なテクニックを提供しており、UI/UXの細かい制御を必要とする開発者にとって有用な情報です。ただし、AI/機械学習の核心的な進展ではなく、特定のプラットフォームの実装詳細に焦点を当てた技術記事です。
編集コメント
Andrej Karpathy厳選の技術記事ですが、内容はAI研究ではなくWindowsのダイアログ制御に関する実装テクニックです。UI開発者向けの実用的な情報として価値があります。
私たちは、ダイアログマネージャーがダイアログを閉じるために使用するシグナルを探ることから始めました。これで、その情報を利用して閉じる動作をカスタマイズできるようになりました。
まずは図から始めましょう。皆、図が好きですから。
WM_SYSCOMMAND/ SC_CLOSE
閉じるボタン/ Alt+F4/ システムメニューの「閉じる」
ユーザーがキャンセルボタンをクリック
WM_COMMAND/ BN_CLICK/ IDCANCEL
IsDialogMessage
前回の記事の最後に、IDがIDCANCELであるボタンがある場合について述べました。
図の中のすべてがWM_COMMANDに集約されていることに注目してください。
さて、閉じるボタンやシステムメニューの「閉じる」コマンドに応答してダイアログを閉じるつもりがないのであれば、それらを有効にしたままにすべきではありません。以下のようにすることで、それらをグレーアウト(無効化)できます。
EnableMenuItem(GetSystemMenu(hDlg, FALSE), SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
では、閉じるボタンを別の方法で扱いたい場合はどうでしょうか?
図から、閉じるボタンはWM_CLOSEを経由していることがわかります。
ESCキーをキャンセルボタンのクリックとは別の方法で扱いたい場合は、IsDialogMessageの段階でそれを傍受する必要があります。
¹ さて、IDCANCELボタンが実際にキャンセルボタンである必要はないことに気付くかもしれません。
原文を表示
We started by exploring the signals the dialog manager uses for dismissing a dialog. Now we can use that information to customize the dismiss behavior.
Let’s start with a diagram, because people like diagrams.
WM_SYSCOMMAND/ SC_CLOSE
Close button/ Alt+F4/ System menu Close
User clicks Cancel button
WM_COMMAND/ BN_CLICK/ IDCANCEL
IsDialogMessage
We noted at the end of that article that if you have a button whose ID is IDCANCEL
Notice that everything in the diagram funnels into WM_COMMAND
Now, if you have no intention of closing the dialog in response to the Close button or the system menu Close command, then you probably shouldn’t leave them enabled. You can gray those out by doing
EnableMenuItem(GetSystemMenu(hDlg, FALSE), SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
Okay, but what if you want to treat the Close button differently?
From the diagram, we see that the Close button goes through a WM_CLOSE
If you want to treat the ESC key differently from a click on the Cancel button, you’ll have to intercept it on the IsDialogMessage
¹ Now, you might notice that there is no requirement that the IDCANCEL
関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み