假設在乙個對話方塊程式中,有兩個文字框
(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...