VB中用API實現文件拖放
借助API函數CallWindowProc、DragAcceptFiles、DragQueryFile、DragFinish同樣可以實現文件從資源管理器EXPLORE到應用程序的拖放,另一種方法是采用OLE拖放,可以參照趣味編程欄目的相關內容。下面我們一起來看看程序編寫的過程。
對于每個需要引用的API函數,我們需要先在程序中說明,如果只在某一窗體內聲明并使用它,則把它聲明為Private,而如果在模塊中聲明,且需要在整個工程內使用它,則需要把它聲明為Public。
SetWindowLong函數的作用是在窗口結構中為指定的窗口設置屬性,利用它我們來改變窗口的屬性參數,其中各個參數的意義如下表所示:
返回值 Long,指定數據的前一個值
在默認狀態下WINDOWS操作系統會指定一個窗口函數來接受和處理WINDOWS消息,而通過使用SetWindowLong函數改變窗口函數的地址使它指向我們自己寫的一個函數WindowProc,這樣WINDOWS消息就會轉由WindowProc函數接收和處理。于是我們就能判斷文件拖放的消息并進行處理。改變窗口屬性的語句如下:
DragAcceptFiles、DragQueryFile、DragFinish三個函數的作用分別是:把某個窗口設置為接收拖放的容器、返回拖放的文件的數量和信息、終止拖放。
對于每個需要引用的API函數,我們需要先在程序中說明,如果只在某一窗體內聲明并使用它,則把它聲明為Private,而如果在模塊中聲明,且需要在整個工程內使用它,則需要把它聲明為Public。
| Public Declare Function CallWindowProc& Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&) 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&) Private Declare Function SetWindowLong& Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&,ByVal nIndex&, ByVal dwNewLong&) |
SetWindowLong函數的作用是在窗口結構中為指定的窗口設置屬性,利用它我們來改變窗口的屬性參數,其中各個參數的意義如下表所示:
| 參數 | 意義 |
| hwnd | Long,欲為其取得信息的窗口的句柄 |
| nIndex | Long,這里取GWL_WNDPROC,表示設置該窗口的窗口函數的地址 |
| dwNewLong | Long,由nIndex指定的窗口信息的新值 |
返回值 Long,指定數據的前一個值
在默認狀態下WINDOWS操作系統會指定一個窗口函數來接受和處理WINDOWS消息,而通過使用SetWindowLong函數改變窗口函數的地址使它指向我們自己寫的一個函數WindowProc,這樣WINDOWS消息就會轉由WindowProc函數接收和處理。于是我們就能判斷文件拖放的消息并進行處理。改變窗口屬性的語句如下:
| procOld = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc) |
DragAcceptFiles、DragQueryFile、DragFinish三個函數的作用分別是:把某個窗口設置為接收拖放的容器、返回拖放的文件的數量和信息、終止拖放。