實現檔案拖放的一種簡潔方法 (轉)

worldblog發表於2007-12-04
實現檔案拖放的一種簡潔方法 (轉)[@more@]

實現拖放的一種簡潔方法

湖北省襄樊市局中心
張洪徵

---- 讀了南京海軍指揮學院黃嚮明同志在貴報上發表的《用MFC實現檔案拖放到編輯框》一文獲益匪淺,同時也發現了該方法的幾點不足:1、自已編寫專用的類,複雜、維護麻煩;2、必須要將檔案拖到對話方塊中的編輯上,拖動的檔名才被接受,而標準的程式只須將檔案拖放到對話方塊即可被接受;3、只能接受一個拖放的檔案。本文要介紹的這種方法只須一個WINDOWS DragQueryFile即可實現檔案的拖放操作,而且完全克服了上述3點不足。下面先介紹一下這個函式。

---- DragQueryFile原型為:

UINT DragQueryFile( HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch )


---- 其中hDrop是指向拖動檔案結構的控制程式碼;

---- iFile 是以0開始的被託動檔案的序號,因為一次可能拖動多個檔案。當此引數

---- 設為0xFFFFFFFF,則函式返回拖動檔案的數量;

---- lpszFile 是指向檔名的緩衝區;

---- cch 是檔名緩衝區的大小,即檔名的字元數。

---- 明確了該函式的引數後,就是一件很簡單的事情了。以下給出一個完整的例項,程式執行後彈出一個對話方塊,可以拖動任意數量的檔案或目錄到上面,鬆開滑鼠後,程式先顯示拖放檔案的數量,然後將拖放的檔名全部顯示在一個List Box控制元件中。具體步驟如下:

  1. 建立一個基於對話方塊的工程drop,然後其它選項全部用預設值。
  2. 選中IDD_DROP_DIALOG對話方塊中Extended Styles的Accept files屬性。
  3. 給IDD_DROP_DIALOG對話方塊新增一個List Box 控制元件IDC_LIST1。
  4. 在ClassWizard中給CdropDlg類新增成員變數m_list,型別為ClistBox。
  5. 給CdropDlg類中增加處理WINDOWS訊息WM_DROPFILES的函式,接受給出的預設名字OnDropFiles,然後輸入以下程式碼:

void CDropDlg::OnDropFiles(HDROP hDropInfo) { char *lpszFileName=new char[512],cFileCount[10]; int nFileCount,i; nFileCount=::DragQueryFile (hDropInfo,0xFFFFFFFF,NULL,512); ::AfxMessageBox(itoa(nFileCount,cFileCount,10)); for (i=0;i記憶體 i="0;" delete []lpszFileName; CDialog::OnDropFiles(hDropInfo); 此語句註釋掉 } < pre>


---- 注意程式中的::DragFinish (hDropInfo);語句是必不可少的,它用於釋放WINDOWS為處理檔案拖放而分配的記憶體。

---- 執行此程式可以看到,拖動的檔案只要一進入對話方塊的邊界,滑鼠上立刻會現一個“+”,在對話方塊上的任意位置釋放滑鼠,拖放的檔案都會被接受,完全解決了《用MFC實現檔案拖放到編輯框》必須將檔案拖到編輯框的不足;而且拖放是透過呼叫WINDOWS API函式實現的,因此程式非常健壯,幾乎沒有什麼維護量。程式在INDOWS98、vc++5.0下透過。


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987973/,如需轉載,請註明出處,否則將追究法律責任。

相關文章