VC實現檔案拖拽獲取檔名

2021-06-07 23:31:47 字數 3904 閱讀 9016

假設在乙個對話方塊程式中,有兩個文字框

(idc_edit_file1

和idc_edit_file2)

和兩個按鈕

(idc_btn_1

和idc_btn_2)

,這兩個文字框中要輸入兩個不同的檔名稱,從而完成相應的操作(如比較兩個檔案的差異),我們不得不通過兩個按鈕來實現兩次

「開啟檔案

」的過程(相信我,這個功能經常會使用到的)。此時,我們可以使用

ondropfiles

功能。

以下從不同角度

(對話方塊、文字框

)來完成這個工作。不管從何種角度,讓我們先來了解一下

ondropfiles

到底是何物。

ondropfiles

是windows

視窗的wm_dropfiles

訊息的訊息響應函式,值得注間的是,對於基於對話方塊的程式,預設是沒有此訊息項的(它隱身了),也就不能正確響應這個訊息。在開始之前,我們先讓這個訊息對基於對話方塊的程式顯現出來:

「類嚮導

」->「

類資訊」

,在message filter

選項中選擇

window, 

確認後,再在

「message maps」

中就會出現

wm_dropfiles

了:

既然提到了

ondropfiles

,函式dragqueryfile()

函式不得不提。通常,在

ondropfiles

函式中,我們通常都會不止一次地使用到這個函式,它能獲取拖曳到當前視窗

(對話方塊、文字框

)中的檔案數量及檔名稱,以下是此函式的簡單說明:

uint dragqueryfile(

hdrop hdrop,

uint ifile,

lptstr lpszfile,

uint cch

);其中,引數說明如下:

hdrop 

:用於區分

」包含被拖拽檔名稱結構

」的控制代碼。

即存放所拖放檔名稱的資料結構的控制代碼,也就是檔名緩衝區的控制代碼;

ifile 

:檔案索引編號(用於指明所要查詢檔案的序號,

如果拖進多個檔案,則索引編號從零開始),如果

ifile

值為0xffffffff 

時,返回的是拖曳到窗體上的檔案的個數。如果

ifile值在0

和拖拽檔案總數之間時,

dragqueryfile

拷貝與檔名儲存緩衝區大小適應的檔名稱到緩衝區中;

lpszfile 

:函式返回時,用於儲存拖拽檔名稱的緩衝區指標。檔名稱是乙個以空終止

「」結尾的字串。如果此引數是

null

,dragqueryfile

函式返回拖拽的檔案數目。函式

dragqueryfile

得到的檔名,是帶完整路徑的檔名;

cch  

:儲存拖拽檔名稱緩衝區的大小,即

lpszfile

指標所指緩衝區的字元數。

返回值說明如下: 1

、如果函式拷貝檔名稱到緩衝區中,返回值就是拷貝的字元數,不包括終止的

null

字元; 

2、如果檔案索引值是

0xffffffff

,則返回值是被拖拽的檔案總數,注意檔案索引變數的值將保持不變,依然為

0xffffffff;3

、如果檔案索引值在

0和拖拽檔案總數之間時,並且

lpszfile

值為null

時,返回值是儲存此被拖拽檔案的名稱所需要的緩衝區大小值,此值是不包括終止

null

字元的字元數。(此種用法很少用,一般會直接用

max_path

巨集定義就可以了

,不必要知道檔名的真正字數)。

實際中常會用到以下兩種情況: 1

、獲取檔案數目:

uint ifilecount;

ifilecount = ::dragqueryfile(hdropinfo, 0xffffffff, null, 0); 2

、獲取指定索引的檔名:

char file_name[max_path];

::dragqueryfile(hdropinfo, ifilecount - 1, file_name, max_path);

一、對話方塊實現

wm_dropfiles訊息

1、開啟對話方塊屬性,選中

「接收檔案

」選項(如此對話方塊才會響應

wm_dropfiles

訊息),如下圖所示:

2、為對話方塊增加

wm_dropfiles

響應函式,即

ondropfiles()

,如下圖所示:

新增**(彈出訊息框,逐個顯示每個檔名)

void caboutdlg::ondropfiles(hdrop hdropinfo)    

}  dragfinish(hdropinfo);  

cdialog::ondropfiles(hdropinfo);   }

4、編譯執行。

這樣,將檔案拖放到對話方塊的任何地方,都可以將該檔名顯示在

idc_edit_file1

對話方塊中了。當然了,只要再

cdragfiledlg

類中再增加乙個計數變數,就可以為另乙個對話方塊實現類似功能了。但是,在這裡,我們會使用另外一種方法完成

idc_edit_file2

的這種功能的新增。

二、文字框實現

wm_dropfiles訊息

1、為idc_edit_file2新增「

接收檔案

」屬性,此操作同對話方塊相應操作相同; 2

、新建類

cfileedit

,基類為

cedit,

如下圖所示:

3、為新類

cfileedit

定義wm_dropfiles

訊息響應,此操作與對話方塊相應操作相同,只是在類嚮導中指定類為

cfileedit

,而不是之前的

cdragfiledlg;

4、書寫

cfileedit

類的ondropfiles

函式,**如下:

指令control

型變數,

並選定型別為

cfileedit

,而不是

cedit,

如下圖所示:

6、編譯執行。

這樣,第二個文字框的功能也完成了。

其實,這兩種方法從原理上來說是相同的,只是物件不同而已,在實際應用中,你可以選擇任意一種就可以了。對於我個人而言,可能會更偏愛第二種作法。

vc中如何獲取開啟檔名

在編制程式的過程中,很多時候我們需要從外部儲存器中獲取檔名。如果你知道檔案路徑,那很容易解決,但是不知道檔案路徑的話,怎麼辦呢?其實答案地球人都知道,那就是vc提供的 開啟檔案對話方塊 怎麼使用它呢?請看 include 包含windows.h標頭檔案 include 包含通用對話方塊標頭檔案.st...

springcloud 上傳檔案獲取檔名亂碼

專案中使用了路由zuul。用httpservletrequest接收檔案引數 使用 multiparthttpservletrequest multi multiparthttpservletrequest httpservletrequest file.getoriginalfilename 得到...

獲取檔名和檔案路徑

1.問題描述 比如已經知道檔案的路徑是 c dir0 dir1 readme.txt 除了用split 的方式獲取檔名和路徑,有沒有什麼更高效的方式 2.解決辦法 os.path.dirname 路徑 os.path.basename 檔名 import os file path d work te...