如此會使當按下視窗右上角的關閉圖示鈕時,會先出現提示視窗說明,若去除褐色字體程式碼時,該視窗關閉的動作將會失效(即按下右上角的關閉圖示鈕均不會有任何動作發生)。

 Public Class form1

    Protected Overrides Sub WndProc (ByRef m As System.Windows.Forms.Message)

        If m.Msg = 161 And m.WParam = 20 Then

            MessageBox.Show("你點到 X 了,視窗即將關閉!")

            Me.Close()

        Else

            MyBase.WndProc(m)

        End If

    End Sub

End Class

Windows 為訊息系統,訊息不斷的在視窗中與系統之間進行傳遞

而Subclassing 機制可用來 操縱 控制及修改作業系統及行程中所傳遞之訊息

亦可 保留 或 攔截 訊息,  藉由訊息的改變, 進而影響系統之行為

Subclassing 技術經常被應用於正常情況下所無法實現的功能。



VB.Net 提供了Form.WndProc 方法來處理Subclassing , 透過它來取得視窗訊息

Message.Msg 屬性: 取得或設定訊息的ID 編號。

Message.WParam 屬性: 取得或設定訊息的WParam 欄位。
    
MyBase : 提供方法來參考目前類別(Class) 執行個體的基底類別。

 

其實如果要在使用者關閉視窗時前出現提示視窗來作再次確認,可以於該視窗的 FormClosing 事件中來做處理。

Public Class form1

    Private Sub form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    
        If MessageBox.Show("確定關閉視窗?", "警告", MessageBoxButtons.YesNo) = MsgBoxResult.No Then
        
            e.Cancel = True
            
        End If
        
    End Sub

End Class

在WPF之後 Window 的 Closing 事件和應用程式的關閉已經切開了,所以 e.CloseReason (視窗被關閉的原因) 似乎已沒那麼重要了。

 

 

 

請參考:

[msdn] HOW TO:使用 MessageWindow 類別

創作者介紹
創作者 tsuozoe 的頭像
tsuozoe

隨便寫寫的新天地

tsuozoe 發表在 痞客邦 留言(1) 人氣()