DOBON.NET DOBON.NETプログラミング掲示板過去ログ

FormのClosingイベントについて

分類:[.NET]

fukuです、いつも参考にさせていただいてます。

FormのClosingイベントでコントロールボックスの「×」ボタンが押された
どうかの判断方法が不明です。CloseModeの様なものがあればご教授願います。

自分が現在やっている方法

    Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
        Me.btnCancel.Tag = Me.Text
    End Sub

    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing

        If Me.btnCancel.Tag <> "" Then
            MsgBox("[×]ボタンが押されました", MsgBoxStyle.Exclamation)
            e.Cancel = True
        End If
    End Sub
> > FormのClosingイベントでコントロールボックスの「×」ボタンが押された
> どうかの判断方法が不明です。CloseModeの様なものがあればご教授願います。

旧VBでいうところのQueryUnloadイベントの引数UnloadModeにあたるものがありません。
そのため自前で仕組みを用意する必要があります。
良い方法かどうかわかりませんが、

1. プログラムからのClose(Closeメソッドの呼出し)
2. ユーザ操作によるClose(Xボタンクリック、タイトルバーのアイコンのシステムメニューによる「閉じる」、Alt+F4押下)

の2点を判断できればよいのであれば、下記のようにしてはいかがでしょう。

(1) ReadOnlyなCloseModeプロパティを追加。
(2) Closeメソッドをオーバーライドし、CloseModeプロパティの内部変数を「プログラムによるClose」の値に設定→その後、MyBase.Close()

このようにすれば、CloseModeプロパティで判断できると思います。

旧VBのUnloadMode互換の機能を目指す場合は、
WndProcメソッドなどのオーバーライドによるサブクラス化で、
各種メッセージを自前処理する必要があります。

Googleで調べたら、ちょうどここのメルマガが引っかかりました。
http://dobon.net/vb/melma/dotnet13.txt
よねKENさんありがとうございました。
まさに、.NETらしく素敵です。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板