ダイアログマネージャーの自己終了方法のカスタマイズ: Close経路の分離
本文の状態
日本語全文を表示中
詳細モードで約1分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
Andrej Karpathy 厳選
メッセージループの流れをインターセプトし、ダイアログマネージャーの終了方法をカスタマイズする方法について説明しています。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
私たちは、ダイアログマネージャーがダイアログを閉じるために使用するシグナルを探ることから始めました。これで、その情報を利用して閉じる動作をカスタマイズできるようになりました。
まずは図から始めましょう。皆、図が好きですから。
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デイリーブリーフで今日の重要ニュースをまとめ読み