1. 程式人生 > >Windows下,檔案(夾)選擇/開啟對話方塊的三種建立方式

Windows下,檔案(夾)選擇/開啟對話方塊的三種建立方式

Windows程式設計時,常用到開啟檔案(夾)對話方塊,選擇檔案或者多個檔案的功能。Windows提供了好幾種方式,現在做個總結,也好方便以後的使用。
常用的方式有三種:

1.1 使用OPENFILENAME這個結構體和GetOpenFileName()函式

這種方式在於能夠可以實現單選檔案或者多選檔案的功能。多選時,只需按照字串的拼接格式進行split即可。

開啟單檔案的程式碼:

    char szFilePath[1024] = {0};   // 所選擇的檔案最終的路徑
    OPENFILENAME ofn= {0};   
    ofn.lStructSize = sizeof
(ofn); ofn.hwndOwner = m_hWnd; ofn.lpstrFilter = "txt檔案(*.txt)\0";//要選擇的檔案字尾 ofn.lpstrInitialDir = "./";//預設的檔案路徑 ofn.lpstrFile = szFilePath;//存放檔案的緩衝區 ofn.nMaxFile = sizeof(szFilePath)/sizeof(*szFilePath); ofn.nFilterIndex = 0; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER ; //標誌如果是多選要加上OFN_ALLOWMULTISELECT
if (!GetOpenFileName(&ofn)) { return ; } if (strcmp(szFilePath, "") == 0) { // 檢驗是否獲取成功 return ; }

效果圖:
效果圖

1.2 使用SHBrowseForFolder呼叫

此種功能,是產生檔案瀏覽的特效。可以選擇檔案或者資料夾。

選擇檔案程式碼示例:

    char szFilePath[1024] = {0};   // 所選擇的檔案最終的路徑
    BROWSEINFO bi;   
    ZeroMemory(&bi,sizeof
(BROWSEINFO)); bi.hwndOwner = NULL; bi.pszDisplayName = szFilePath; bi.lpszTitle = ("從下面選擇檔案或資料夾:"); bi.ulFlags = BIF_BROWSEINCLUDEFILES; LPITEMIDLIST idl = SHBrowseForFolder(&bi); if (NULL == idl) { return; } SHGetPathFromIDList(idl,szFilePath); if (strcmp(szFilePath, "") == 0) { // 檢驗是否獲取成功 return ; }

效果圖:
效果圖2

1.3 使用系統的CFileDialog

CFileDialog是系統提供的開啟和儲存檔案對話方塊類。可以彈出開啟檔案對話方塊,也可以彈出儲存檔案對話方塊。功能相比比較豐富。

在介紹如何使用之前,著重介紹其建構函式的定義。這是關鍵。

1.3.1 建構函式 CFileDialog()

CFileDialog::CFileDialog( 
        BOOL bOpenFileDialog, 
        LPCTSTR lpszDefExt = NULL, 
        LPCTSTR lpszFileName = NULL, 
        DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
        LPCTSTR lpszFilter = NULL, 
        CWnd* pParentWnd = NULL );

引數意義如下:
- bOpenFileDialog 為TRUE則顯示開啟對話方塊,為FALSE則顯示儲存對話檔案對話方塊。
- lpszDefExt 指定預設的副檔名。
- lpszFileName 指定預設的檔名。
- dwFlags 指明一些特定風格。
- lpszFilter 是最重要的一個引數,它指明可供選擇的檔案型別和相應的副檔名。

引數格式如:
"Worksheet Files (*.xls)|*.xls;*.xlsx|text Files (*.txt)|*.txt|All Files (*.*)|*.*||";
檔案型別說明和副檔名間用 | 分隔,同種型別檔案的副檔名間可以用 ; 分割,每種檔案型別間用 | 分隔,末尾用 || 指明。
- pParentWnd 指明父視窗

該函式未指明選擇檔案對話方塊的預設選擇路徑,一般情況是當前路徑。

1.3.2 選擇開啟檔案對話方塊的使用

一般情況下,通過建構函式構造一個CFileDialog類物件,通過doModel函式來彈出相應的對話方塊,使用者在對話方塊中選中檔案,點選確定,即可獲取到該檔案的路徑。儲存檔案對話方塊類似。

開啟檔案對話方塊示例程式碼:

    char szFilePath[1024] = {'\0'};
    CString filter("文字文件(*.txt)|*.txt|All Files (*.*)|*.*||");  
    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,filter);  
    if(dlg.DoModal()==IDOK)  
    {  
        strcpy(szFilePath, dlg.GetPathName().GetBuffer(0)) ;
    }  
    else
    {
        return ;
    }

    if (strcmp(szFilePath, "") == 0)
    {
        return ;
    }

效果圖:
效果圖3

相關推薦

Windows檔案選擇/開啟對話方塊建立方式

Windows程式設計時,常用到開啟檔案(夾)對話方塊,選擇檔案或者多個檔案的功能。Windows提供了好幾種方式,現在做個總結,也好方便以後的使用。 常用的方式有三種: 1.1 使用OPENFILENAME這個結構體和GetOpenFileName()

Java檔案選擇器—JavaFX

在不久之前,我遇到一個問題,同學問我,記事本的開啟與儲存應該怎麼寫,當時我這樣想,應該可以根據File類獲得路徑的子檔案,用搜索演算法構造一個目錄樹,然後再做個圖形介面就行,沒什麼問題的話這樣做應該可以達到效果,但是今天我突然發現JavaFX裡面原本就有這個東西,不需要我們再重複造輪子了。

windows 7 區域網檔案共享方法

如何在同一區域網中的兩臺主機間傳遞檔案?需要藉助一個橋樑工具,即插即拔的 U 盤嗎?未必。 要求:位於區域網中的兩臺主機彼此能夠 ping 通。 設定流程: (1)將需要在主機間共享的檔案,設定為共享、 (2)其他主機訪問該共享檔案。 s

【朝花夕拾】Android自定義View篇之自定義View的實現方式及自定義屬性詳解

前言        儘管Android系統提供了不少控制元件,但是有很多酷炫效果仍然是系統原生控制元件無法實現的。好在Android允許自定義控制元件,來彌補原生控制元件的不足。但是在很多初學者看來,自定義View似乎很難掌握。其中有很大一部分原因是我們平時看到的自定

Windows使用Linux命令ZIP 打包檔案

轉載自 https://blog.csdn.net/my_learning_road/article/details/69568215筆者最近需要用處理大量txt檔案,這些txt檔案都比較大,出於效率考慮想用Windows下面的批處理命令。但是發現用於處理文字檔案的sed命令

IntelliJ IDEA classpath包含哪些資料以及如何把檔案新增到classpath

在IDEA中,標為藍色的資料夾被認定為包含在classpath中,例如上圖中的resources、src資料夾。把檔案位置以"classpath:applicationContext.xml"的形式提供時,IDEA會從classpath中查詢該檔案,把包含該檔案的資料夾標記為“Source Root”即可

VMware虛擬機器與本機Windows系統實現共享檔案

VMware虛擬機器與本機Windows系統共享檔案其實是通過VMware自帶的共享資料夾功能實現的 具體步驟有三步,如下: 1.安裝VMware Tools 滑鼠右鍵點選你的虛擬機器 > 點選安裝VMware Tools > 等待一會兒會彈出安裝視窗 > 下一步,

批處理解決實際問題1——將目錄所有檔案*.cpp分別建立同名資料並移入其中

問題描述: 學習OpenGL時,從網上下載了一些原始碼,解壓後發現所有.cpp檔案在同一個目錄下,這樣直接一個一個全部編譯的話,就亂套了,雖然不影響結果但不利於管理。於是,我需要寫一個程式將所有*.cpp檔案放入到同名檔案加下。 解決方案: 毫無疑問,採用批處理技術。思路

git 在windows的應用 - 遠程倉庫代碼管理

軟件研發 研發管理 克隆遠程git 目錄https://github.com/pcdogyu/git4windows.git克隆下來了生成1.txtscan stage signoff commit2次提交記錄推送到遠程地址完成了還沒來得及去網頁呢,就收到系統提示郵件網頁查看1.txt已經提交上去了對

git 在windows的應用 - 本地倉庫代碼管理

軟件研發 研發管理 訪問https://gitforwindows.org/? 下載一個安裝包,一路next下去git config --global user.name "Pcdog" git config --global user.email "[email protected]"cd d:

linux 檢視和修改檔案許可權

1. 使用 ls -l 或者 ll 檢視檔案許可權  第一位表示檔案型別:d 表示資料夾 - 表示普通檔案 r (read)表示可讀 w (write)表示可寫 x 表示執行許可權:通常指可以執行的程式檔案或者指令碼檔案     rwx 三個

Windows利用goaccessdocker分析Nginx日誌

        由於公司專案需要分析Nginx,工具不少,比如ngxtop的實時監控,經過對其初步瞭解,發現必須所有配置檔案都在nginx.conf下才可以使用。然而專案卻include了很多配置。而且由於資源限制,在伺服器上安裝也不現實,因此有了日誌分析的念頭。而

Windows在PythonAnaconda中安裝Dlib庫

Windows下在Python(Anaconda)中安裝Dlib庫 引言   介紹在Windows作業系統下,在Python的Anaconda整合環境中,安裝Dlib庫; 對於不瞭解原始碼編譯的,或者利用cmake方法失敗的,可以嘗試下此方法: Windows 10 + Python

windows facenet使用

一、安裝方式:把自己下載的facenet的src內部全部檔案放到anaconda的site檔案內的facenet(自己新建)即可。 二、現在有兩個檔案有src檔案,一個是自己下載的,如下 一個是自己新建的facenet檔案,也就是最上面那個圖的 給上面那個site-packages檔案內的

windows安裝Composer轉載

在windows下安裝Composer Composer是 PHP 用來管理依賴(dependency)關係的工具。你可以在自己的專案中宣告所依賴的外部工具庫(libraries),Composer 會幫你安裝這些依賴的庫檔案。 中文相關網站:http://www.phpcomposer

Linux和Windows的NCNetcat命令測試埠連通性

一、Linux OS 環境下(以Centos為例),使用nc命令分別測試TCP和UDP埠連通性: 安裝方法: 在客戶端和伺服器端分別安裝nc工具,安裝命令如下: yum install nc 1 1. Linux OS下使用nc命令,實現TCP方式監聽伺服器端5000

Windows使用Redis1安裝和使用

一、redis是什麼 redis是一款根據bsd開源協議發行的高效能key-value儲存系統。他通常被稱為資料結構伺服器,因為值可以是字串,雜湊,列表,集合,有序集合和點陣圖等型別。 最好的地方就是提供資料持久化功能,定時把記憶體寫入檔案,從而不至於造成資料丟失,相對於

分享一個自寫的Python遠端命令和檔案傳輸類

最近在跟一個自動化釋出平臺的建設事項,其中 Linux 系統的遠端控制通道則由我獨立開發完成,其中涉及到了 Linux 系統遠端命令和檔案傳輸操作。 因為之前寫 Linux 系統密碼管理系統的時候,用的是 Paramiko 的 SSHClient。所以,我這次依然採用 Paramiko 來做實現,程式碼雖短

Ubuntu終端中刪除/建立檔案

首先Ctrl + Alt + L開啟終端 建立檔案: touch 檔名 刪除檔案: rm 檔名 建立資料夾: mkdir 資料夾名 刪除資料夾: rmdir 資料夾名 注意此時的資料夾中如果包含其他檔案的話是無法被刪除的。 刪除帶有檔案的資料夾: rm -r 資料

Windowsthinkphp5.0tp5的memcache資料快取技術的實現過程

1、php配置檔案的設定(php.ini)       新增一行:extension=php_memcache.dll       比如我使用的是phpstudy整合環境(開啟php.in