フォーム右上の「×」ボタンのIDは!?

解決


gari  2004-12-14 05:51:49  No: 55676  IP: [192.*.*.*]

すごく単純な質問で申し訳ないとは思うのですが、
どうしてもわかりません。

MFCのダイアログベースなのですが、フォーム右上の閉じる(×)のIDは何か用意されているのでしょうか!?

現在はプログラムで無理矢理制御してるのですが…

編集    削除
なーめ  2004-12-14 07:08:11  No: 55677  IP: [192.*.*.*]

Spy++ で追ってみてはどうでしょうか。
まず、非クライアント領域の WM_NCLBUTTONDOWN
をキャッチして、そのハンドラが、WM_COMMAND+SC_CLOSEを生成。
そのハンドラが WM_CLOSE を生成
....
WM_DESTROY
WM_NCDESTROY

「×」ボタンは単なるウィンドウの非クライアント領域と考えられますね。
メッセージIDにしかならないのではないかな。

編集    削除
fuku  2004-12-14 09:14:08  No: 55678  IP: [192.*.*.*]

VC++6.0/MFC/ダイアログベースだと×ボタンクリック時にIDCANCELハンドラのOnCancelが呼ばれます。
なお、このOnCancelからCDialog::OnCancelを呼ばずにreturnするとウィンドウは閉じません。

最初から置いてある「キャンセル」ボタンと共用なので「キャンセル」ボタンがいらなくてもハンドラだけは用意しておくとこういうときに便利です。

編集    削除
シャノン  2004-12-14 19:44:18  No: 55679  IP: [192.*.*.*]

要するに何をしたいか、が書かれていないのですが…×ボタンを無効化したい?
アレの ID は SC_CLOSE です。
が、WM_COMMAND ではなく WM_SYSCOMMAND で送られてきます。
押されたときにダイアログが閉じないようにするには、OnSysCommand で、( nID & 0xFFF0 ) の値が SC_CLOSE であるときに、親クラスの OnSysCommand を呼ばないようにすれば閉じられなくなります(ただし、キャンセルボタンなどの方法では閉じられます)。
そもそも押せないようにするには、あのボタンはシステムメニュー(ウィンドウ左上のアイコンをクリックしたときに出るメニュー)と連動していますので、OnInitDialog あたりで、
GetSystemMenu( FALSE )->RemoveMenu( SC_CLOSE, MF_BYCOMMAND );
とでもしてやれば無効化できます。

編集    削除
gari  2004-12-17 03:13:39  No: 55680  IP: [192.*.*.*]

SC_CLOSEですか。知りませんでした。
シャノンさんありがとうございます。

編集    削除