?? mssubclass.bas
字號:
Attribute VB_Name = "MSubclass"
Option Explicit
Public Const MAX_PATH As Long = 260&
'標示我們要截獲的消息
Public Const WM_DROPFILES As Long = &H233&
'保存原 窗體屬性的變量,其實是默認的 窗體函數 的地址
Public procOld As Long
'
Public Declare Function CallWindowProc& Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, _
ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)
'拖放操作相關的API函數
Public Declare Sub DragAcceptFiles Lib "shell32.dll" (ByVal hWnd&, ByVal fAccept&)
Public Declare Function DragQueryFile& Lib "shell32.dll" Alias "DragQueryFileA" (ByVal hDrop&, ByVal iFile&, _
ByVal lpszFile$, ByVal cch&)
Public Declare Sub DragFinish Lib "shell32.dll" (ByVal hDrop&)
'WARNING!!!!-----------------------------------------------------------
'注意這段代碼是不能用DEBUG一步步調試的,否則會造成錯誤(崩潰)
'VB真絕,想看看回調過程是怎么實現的都不行
'對消息截獲的機制可以按下述理解:
' 這里要仔細理解一下,我們為窗體新指定了窗體函數地址,也就是說操作系統發送給窗體的
'消息將被 WindowProc函數 所截獲(而改變前消息是被默認的 窗體函數 所獲得并作相應處理的)
' 這樣我們在 WindowProc函數 中對所截獲的消息進行判斷,會有三種情況:
'<1>如果是需要通過程序來處理的消息就通過 WindowProc函數 中的相應語句處理;
'<2>如果是要原來的 窗體函數 來處理則把這個消息傳遞給原窗體函數(其實是指針指向的改變);
'<3>如果不是我們需要的消息,也傳遞給原 窗體函數 來處理。
'可以參見 改變系統菜單 中的源碼注釋
'WARNING!!!!-----------------------------------------------------------
'回調函數,用來截取消息
Public Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
'確定接收到的是什么消息
Select Case iMsg
'如果是 通知文件放下 的消息,就攔截消息
Case WM_DROPFILES
'通知在FORM模塊中定義的DropFiles函數來接收 指向 放下的文件 的句柄
frmDragDropFiles.DropFiles wParam
'返回0并退出這個WindowProc
WindowProc = False
Exit Function
End Select
'如果不是我們需要的消息,則傳遞給原來的窗體函數處理
WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
End Function
'---------------------相關內容-----------------------
'什么是子類派生技術
' WINDOWS運行的基礎是“消息機制”,所謂的“消息”是一個唯一的值,這個值會被一個窗體或操作系統
'收到,它能告訴什么事件發生了以及需要采用什么樣的動作來響應。這與我們人類的神經系統將感知的信
'息傳遞給大腦,而大腦發出指令給我們的身體非常相似。
' 于是每一個窗體都具有一個消息句柄,這個機制使得所有發自于WINDOWS操作系統的消息能被接收到
'需要強調的是每個窗體以及每個控件,包括按鈕、文本框、圖片框等都具有這樣的消息句柄。WINDOWS操
'作系統會跟蹤這些消息句柄,這稱為類結構中的一個WindowProc,所謂的類結構是于窗體句柄相關聯的。
' 當我們加入一個新的WindowProc函數而這個WindowProc與原始的窗體函數相符合的話,我們稱這個窗
'被子類化了。換言之,如果WINDOWS操作系統發給你所在的WindowProc一個消息,而你所在的WindowProc
'正在響應其它的動作,這時你必須將剩余的消息傳遞給一個默認的WindoProc。
'如下所示: 操作系統消息-->你所在WindoProc-->默認的WindoProc
'而一個窗體是可以被子類化多次的,這樣就產生了如下的情況:
'Windows Message Sender --> Your WindowProc --> Another WindowProc _
' --> Yet Another WindowProc --> Default WindowProc
' What is subclassing anyway?
' 通過窗體子類化,你可以改變響應消息的順序,也就是說,你可以把消息傳遞到默認的WindowProc上
'而不立即響應。舉個例子:
' 如果我們要在接收到WM_PAINT 消息后,在窗體上畫出一些東西,可以用下面的語句實現:
'
' Public Function WindowProc(Byval hWnd, Byval etc....)
'
' Select Case iMsg '篩選出WM_PAINT消息
' Case SOME_MESSAGE '如果是其他消息
' DoSomeStuff
'
' Case WM_PAINT '如果是WM_PAINT 消息
' '首先把消息傳遞給一個默認的WindowProc
' WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
'
' DoDrawingStuff '進行畫圖操作
'
' Exit Function '因為我們已經把消息傳遞給默認的WindowProc,我們可以退出這個WindowProc
'
' End Select
'
' End Function
'------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -