讓窗體支援檔案拖拽

2021-05-24 06:26:40 字數 1734 閱讀 3962

一、基本概念

拖放,是指用滑鼠拖動的方法,在不同程式的視窗之間、同乙個程式的不同視窗之間或同一程式同一視窗的不同控制項之間,進行移動、複製和貼上等操作的技術。拖放操作是在作業系統的幫助下完成的。被拖動的物件首先向作業系統註冊它使用的資料格式,並按指定的資料格式提供資料,拖放操作結束時,接收拖放的視窗按指定的資料格式提取有關資料,並根據提取的資料生成相應的物件。

二、兩種拖放方式

拖放有兩種型別:ole拖放和檔案管理器拖放。這兩種方式是完全不同的機制。檔案管理器拖放只能處理檔名,通過對映目的視窗的wm_dropfiles訊息,視窗就可以收到拖放進來的檔名。ole拖放則更加通用一些,它允許你拖放可同時被儲存在剪貼簿上的任何資料。本文首先介紹檔案管理器拖放,然後再介紹ole拖放,最後給出乙個用ole實現的,支援檔案拖放操作的增強列表控制項clistctrlex。

三、檔案管理器拖放原理及例項

這種方式的實質就是產生乙個訊息wm_dropfiles。技術上沒有什麼難點,主要用到下面幾個api函式:dragqueryfile、dragquerypoint、dragfinish。它們的原型和註解分別如下:

uint dragqueryfile(hdrop hdrop, uint ifile, lptstr lpszfile, uint cch)

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

bool dragquerypoint(hdrop hdrop, lppoint lppt);

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

void dragfinish(hdrop hdrop);

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

首先,建立乙個對話方塊工程,確保選中對話方塊的accept files屬性。如果不選,也可以在視窗建立的時候(譬如oncreate函式中)呼叫dragacceptfiles(true),效果是一樣的。

然後對映wm_dropfiles訊息。該訊息處理函式原型如下:void ondropfiles(hdrop hdrop),注意入口引數為hdrop型,它是乙個結構體指標,所指向的結構體中包含了被拖放的檔案的名稱。接下來我們主要要完成兩個動作:第一,通過呼叫dragqueryfile並指定其ifile引數為0xffffffff,得到本次拖放操作的檔案數目;第二步,用乙個迴圈依次取出各個檔名。示例如下:

void clistctrlex::ondropfiles(hdrop hdrop)

;uint

nnumoffiles = dragqueryfile(hdrop, 0xffffffff, null, 0); //

得到檔案個數

for (uint nindex=0 ; nindex< nfilecount; ++nindex)

dragfinish(hdrop);

}

Demo 0034 窗體支援檔案拖拽

許多支援檔案開啟的軟體如vs notepad,word,通常都支援滑鼠拖拽檔案到應用軟體窗體實現快速開啟檔案。本節裡我們也模仿這個功能的實現.要完成此功能大體思路 1.窗體需要支援ws ex acceptfile 這個屬性 2.通過處理wm drapfiles訊息使用dragqureyfile,dr...

Winform程式拖拽檔案到窗體

1 首先需要將接收拖拽的窗體屬性allowdrop設定為true。2 編寫窗體拖拽進入 dragenter 和拖拽完成 dragdrop 事件。private void frmcode dragenter object sender,drageventargs e else private void...

VC程式設計支援視窗拖拽開啟檔案

uint dragqueryfile hdrop hdrop,uint ifile,lptstr lpszfile,uint cch 其中hdrop是指向拖動檔案結構的控制代碼 ifile 是以0開始的被託動檔案的序號,因為一次可能拖動多個檔案。當此引數 設為0xffffffff,則函式返回拖動檔案...