轉自http://blog.sina.com.cn/s/blog_48554c770100q38a.html
VC6.0中實現檔案拖拽- -
我們經常使用到檔案拖拽的方法,來對某一個或者某一些檔案進行操作。
在VC中,我們可以不利用開啟檔案對話方塊來選擇檔案,從而對檔案進行操作,我們也可以使用拖拽來實現這樣的功能。具體如下:
1.首先,把一個對話方塊或者表單的擴充屬性【接受檔案】勾選上。
2.我們對WM_DROPFILES訊息進行處理。
在這裡我們使用到了一個API函數:DragQueryFile,它的原型如下:
UINT DragQueryFile(
HDROP hDrop,
UINT iFile,
LPTSTR lpszFile,
UINT cch
);
當第二個參數iFile為 0xFFFFFFFF 時返回的是拖曳到表單上的檔案的個數。
第三個參數是檔案名稱,第四個參數是檔案名稱的長度。
具體使用方法:
unsigned int count;
char filepath[100];
count=::DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,NULL);//首先擷取檔案的個數。
if(count)
{ for(unsigned int i=0;i<count;i++)
{ int pathlen=::DragQueryFile(hDropInfo,i,filepath,sizeof(filepath));//擷取檔案路徑。
this->MessageBox(filepath);
}
}
就是這麼簡單!
當我們把一個表單的標題列去掉以後,如果需要左鍵移動表單的位置,只需要在處理WM_LBUTTONDOWN
訊息的代碼中加入:
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
void CCHTMLOptimizerDlg::OnDropFiles(HDROP hDropInfo)
{
UINT nCount = ::DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0);
UINT i;
CString strFileName;
for(i=0;i<nCount;i++)
{
::DragQueryFile(hDropInfo,i,strFileName.GetBuffer(MAX_PATH),MAX_PATH);
strFileName.ReleaseBuffer();
AddFilesInDir(this,strFileName); //這是我的函數 strFilename就是檔案地址
}
CDialog::OnDropFiles(hDropInfo);
}
在Ondrop事件裡先用UINT nNumFilesDropped = DragQueryFile(hFileDroped, 0xFFFFFFFF, NULL, 0);獲得拖拽的數量然後
DragQueryFile(hFileDroped, nFile,szFilename, MAX_PATH + 1);就可以了得到檔案資訊了。
VC實現檔案管理工具拖拽(Drag-and-Drop)
在日常的程式中,為了操作的方便,經常需要使用滑鼠拖拽的方式把檔案管理工具中的檔案拖拽到我們自己寫的程式中,以下就簡單介紹以下實現該操作的方法。
其實檔案管理工具的拖拽方式實現起來很簡單,主要通過幾個函數來實現,訊息WM_DROPFILES的響應函數OnDropFiles,還有三個API函數:DragQueryFile,DragQueryPoint和DragFinish。 在啟動拖拽動作時,作業系統會分配一塊記憶體儲存拖拽的檔案的資訊,並通過一個HDROP類型的控制代碼把該塊記憶體的地址傳遞給函數OnDropFiles函數。
檔案管理工具拖拽方式的實質就是處理WM_DROPFILES訊息,要讓視窗或控制項響應該訊息,需要先設定Accept Files屬性,可以通過在視窗或控制項的屬性頁面中勾選Accept Files,也可以通過調用CWnd類的成員函數DragAcceptFiles(TRUE)或API函數DragAcceptFiles(HWND hWnd,BOOL fAccept),可以在OnCreate或OnInitDialog之類的函數中調用,它們的效果都是一樣的。
設定了Accept Files屬性後,就可以添加WM_DROPFILES訊息的響應函數OnDropFiles了,ClassWizard不支援該函數,所以需要手動添加此函數,然後在該函數中調用上述的三個API函數,其代碼如下:
void DragDemo::OnDropFiles(HDROP hDrop)
{
// 定義一個緩衝區來存放讀取的檔案名稱資訊
char szFileName[MAX_PATH + 1] = {0};
// 通過設定iFiles參數為0xFFFFFFFF,可以取得當前拖動的檔案數量,
// 當設定為0xFFFFFFFF,函數間忽略後面連個參數。
UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
// 通過迴圈依次取得拖動檔案的File Name資訊,並把它添加到ListBox中
for(UINT i=0; i<nFiles; i++)
{
DragQueryFile(hDrop, i, szFileName, MAX_PATH);
m_listCtrl.AddString(szFileName);
}
// 結束此次拖拽操作,並釋放分配的資源
DragFinish(hDrop);
}
其中三個API函數的具體用法可以參照MSDN。由於本例的操作是直接拖拽的對話方塊上,所以不需要通過DragQueryPoint來取得滑鼠鬆開時的位置,在實際的實現中,最好是為空白間派生出一個類,在該類中定義訊息響應函數OnDropFiles,這樣就不需要查詢滑鼠的位置,也不需要設定滑鼠的指標樣式。