- 題名: フォーム右上の閉じるボタン
- 日時: 2003/08/15 14:18:59
- ID: 334
- この記事の返信元:
- (なし)
- この記事への返信:
- [342] Re[1]: フォーム右上の閉じるボタン2003/08/16 20:10:48
- [343] Re[1]: フォーム右上の閉じるボタン2003/08/17 2:34:23
- ツリーを表示
こんばんは、てつ☆ミさん。ピラルクです。
[X]ボタンのイベントを直接捕らえるのは無理のようなので、
それ以外のForm.Closingを呼ぶ元となるイベントと協調して
Form.Closingで識別することはかろうじて可能のようです。
(開発環境の■ボタンは強制KillなのでClosingが来ない)
(補)このような識別が必要になるというような状態は、
別のところに直すべき問題があると思われ、以下
のようなトリッキーとも言える実装を試みること
はおすすめしません。
'--------+---------+---------+---------*---------+---------+---------+----
'[X]ボタンでは閉じれないForm
'--------+---------+---------+---------*---------+---------+---------+----
Public Class Form1
Inherits System.Windows.Forms.Form
Implements IMessageFilter
...
Private Const WM_CLOSE = &H10
Private Const WM_NCLBUTTONDOWN = &HA1
Private Const WM_NCMOUSEMOVE = &HA0
Private Const WM_SYSCOMMAND = &H112
Private Const SC_CLOSE = &HF060&
Private m_Closable As Boolean = True
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Application.AddMessageFilter(Me)
End Sub
Private Sub Form1_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
If Not m_Closable Then
'[X]ボタンで閉じられかけている場合
e.Cancel = True
End If
End Sub
Private Sub btnClose_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnClose.Click
'閉じるボタンは常に閉じることが可能
m_Closable = True
Close()
End Sub
Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) _
As Boolean Implements IMessageFilter.PreFilterMessage
If m.Msg = WM_NCLBUTTONDOWN Then
'[X]の可能性あり
m_Closable = False
ElseIf m.Msg = WM_SYSCOMMAND And m.WParam.ToInt32 = SC_CLOSE Then
'コントロールBOX(タスクバー含む)の[閉じる]あるいは"Alt+F4"
m_Closable = True
ElseIf m.Msg = WM_CLOSE Then
'タスクマネージャでKillされる
m_Closable = True
End If
Return False
End Function
End Class
# なんか抜け道ありそう...
Form.Closingイベントでフォーム上の右上の閉じる(×)ボタンが押されたか否かを判断するにはどのようにすればよろしいのでしょうか?
ご教授ください。
よろしくお願いします。