MFC拖拽

 在日常的程序中,爲了操作的方便,經常需要使用鼠標拖拽的方式把文件管理器中的文件拖拽到我們自己寫的程序中,以下就簡單介紹以下實現該操作的方法。

       其實文件管理器的拖拽方式實現起來很簡單,主要通過幾個函數來實現,消息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,這樣就不需要查詢鼠標的位置,也不需要設置鼠標的指針樣式。

    以上有什麼錯誤還往大家指正,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章