VB.Net 關於表單上 Control Box 的 系統選單 項目 增加
VB.Net 關於表單上 Control Box 的 系統選單 項目 增加
Public Class Form1
' API 宣告
Private Declare Function GetSystemMenu Lib "user32" _
(ByVal hwnd As Integer, ByVal bRevert As Integer) As Integer ' 註1
Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" _
(ByVal hMenu As Integer, ByVal wFlags As Integer, _
ByVal wIDNewItem As Integer, ByVal lpNewItem As String) As Integer ' 註2
Private Sub Form1_Load(ByVal s As Object, ByVal e As EventArgs) Handles MyBase.Load
AddSysMenu() ' 註3
End Sub
Private Sub AddSysMenu()
Dim hwnd As Integer = GetSystemMenu(Handle, 0) ' 註4
AppendMenu(hwnd, 2048, 0, "-") ' 註5
AppendMenu(hwnd, 0, 0, "說明(&H)") ' 註6
End Sub
Protected Overrides Sub WndProc(ByRef m As Message) ' 註7
If m.Msg = 274 And m.WParam = 0 Then MessageBox.Show("這裡放程式表單說明 !") ' 註8
MyBase.WndProc(m) ' 註9
End Sub
End Class
' 註1:
' GetSystemMenu Function : 取得 System menu 的 Handle 值
' System menu 也就是 Form 上 Control Box 點選後所出現的那個 Menu
' 註2:
' AppendMenu Function : 附加選單項目 ( Menu Item )
' 註3:
' 呼叫程序 ( 增加系統選單項目 )
' 註4:
' 取得視窗系統選單掌控值
' 註5:
' 附加 Menu Item 分隔線 ( Separator )
' 註6:
' 附加 Menu Item 說明 ( String )
' 註7:
' Form.WndProc 方法
' VB.Net 提供了Form.WndProc 方法來處理 Subclassing , 透過它來取得視窗訊息
' Protected : 指定已宣告的程式設計項目只可從自己的類別或從衍生類別中進行存取。
' Overrides : 指定屬性或程序會覆寫自基底類別繼承的相同命名屬性或程序。
' 參數Message : 可實作 Windows 訊息。
' Message.Msg 屬性: 取得或設定訊息的 ID 編號。
' Message.WParam 屬性: 取得或設定訊息的 WParam 欄位。
' 註8:
' 判斷使用者是否點選到了所新增的選單項目,可秀訊息或做其他動作
' 註9:
' MyBase : 提供方法來參考目前類別 ( Class ) 執行個體的基底類別。
Windows 為訊息系統,訊息不斷的在視窗中與系統之間進行傳遞
而 Subclassing 機制可用來操縱控制及修改作業系統及行程中所傳遞之訊息
亦可保留或攔截訊息, 藉由訊息的改變, 進而影響系統之行為
Subclassing 技術經常被應用於正常情況下所無法實現的功能。