給MFC程式新增檔案拖放處理

2021-06-05 07:57:42 字數 1806 閱讀 5223

當我們從shell(window的檔案瀏覽器)中拖入乙個檔案到應用程式視窗時,windows會發生乙個訊息wm_dropfiles給程式,支援檔案拖放操作的本質就是程式要適當地處理這個訊息。並不是所有程式都可以接受檔案拖放訊息,只有具有ws_ex_acceptfiles視窗屬性的視窗,才能收到這條訊息。當使用win32 api進行程式設計時,就要在建立這個視窗時加上這個擴充套件屬性。

如果是mfc程式,則可以在建立程式時,在嚮導中選擇視窗的accept files屬性,也可以在視窗建立的時候(比如oncreate函式)呼叫視窗的成員函式dragacceptfiles(true),效果是一樣的。

在begin_message_map中加入 on_wm_dropfiles()

支援檔案拖放時,主要會涉及到以下三個api函式:dragqueryfile、dragquerypoint、dragfinish。

它們的原型和註解分別如下:   

uintdragqueryfile(hdrophdrop,uintifile,lptstrlpszfile,uintcch)  

這個函式用來取得拖放的檔名。其中,hdrop是乙個指向含有被拖放的檔名的結構體的控制代碼(win32 api程式設計時,這個控制代碼就是wm_dropfiles訊息的wparam引數,而mfc程式設計時,則可以從訊息處理函式的引數直接得到);ifiles是要查詢的檔案序號,因為一次可能同時拖動很多個檔案;lpszfiles是出口緩衝區指標,儲存ifiles指定序號的檔案的路徑名,cch指定該緩衝區的大小。注意,第一,如果我們在呼叫該函式的時候,指定ifile為0xffffffff,則dragqueryfile將忽略lpszfile和cch引數,返回本次拖放操作的檔案數目;第二,如果指定lpszfile為null,則函式將返回實際所需的緩衝區長度。

booldragquerypoint(hdrophdrop, lppoint lppt);        

這個函式用來獲取,當拖放操作正在進行時,滑鼠指標的位置。第二個引數lppt是乙個指向point結構體的指標,用來儲存檔案放下時,滑鼠指標的位置。視窗可以呼叫該函式以查詢檔案是否落在自己的視窗矩形中。   

voiddragfinish(hdrophdrop);     

當拖放操作處理完畢後需呼叫該函式釋放系統分配來傳輸檔名的記憶體。   

要處理wm_dropfiles訊息時,可以使用嚮導給對應的視窗新增訊息處理函式,該訊息處理函式原型是:void ondropfiles(hdrop hdrop):

以下是該函式處理的示例**:

cpp**

voidcdialogdropfiledlg::ondropfiles(hdrophdropinfo)   

;      

//得到檔案個數   

uintnnumoffiles = dragqueryfile(hdropinfo, 0xffffffff, null, 0);   

for(uintnindex=0 ; nindex< nnumoffiles; ++nindex)       

dragfinish(hdropinfo);     

cdialog::ondropfiles(hdropinfo);   

}  

給MFC程式新增檔案拖放處理

程式支援檔案拖放會使程式使用起來更加方便。當我們從shell window的檔案瀏覽器 中拖入乙個檔案到應用程式視窗時,windows會發生乙個訊息wm dropfiles給程式,支援檔案拖放操作的本質就是程式要適當地處理這個訊息。並不是所有程式都可以接受檔案拖放訊息,只有具有ws ex accep...

給事件新增處理程式

給事件新增處理程式的過程 1 定義乙個事件處理方法,其返回型別和引數匹配為事件訂閱的委託的返回型別和引數 2 宣告乙個委託型別的變數,用於事件 3 把委託變數初始化為委託型別的例項,該例項指向事件處理方法 4 把委託變數新增到事件的訂閱器列表中 例如給timer新增事件處理程式,要訂閱事件的委託為e...

win7 除錯MFC程式之拖放檔案

乙個mfc程式,拖放檔案到窗體,然後解析檔案格式。以上為背景,正常執行此mfc程式,拖放檔案可以正常處理。但是用olldbg載入這個mfc程式,執行之後拖放檔案到上邊就毫無反應。換了一堆od都沒有解決。最後發現是管理員許可權問題。在win7下,以管理員許可權執行這個mfc程式,拖放檔案到上邊一樣是不...