1. 程式人生 > >[MFC]目錄選擇與檔案選擇

[MFC]目錄選擇與檔案選擇

最近專案中有下面需求:

1.  彈出目錄或檔案選擇對話方塊

2. 當選中目錄時將該目錄下所有.c檔案的絕對路徑獲取出來

3. 當選中檔案時,判斷是否是.c檔案,如果是.c檔案將該.c檔案絕對路徑獲取出來

4. 支援多選目錄

        5. 支援多選檔案

6. 支援檔案與目錄混選模式,且支援多選

下面我面先看一下一般目錄選擇和檔案選擇是怎麼實現的吧:

#include <wtypes.h>
#include <atlbase.h>
#include <shlobj.h>
#include <iostream>
using namespace std;

//顯示資料夾瀏覽對話方塊
//用shell提供的SHBrowseForFolder,需要一個指向BROWSEINFO結構的指標

/*  
BROWSEINFO結構:
	HWND hwndOwner,指定對話方塊的父視窗的控制代碼
	LPCITEMIDLIST pidlRoot,指定開啟瀏覽的根目錄,若為NULL,表示桌面
	LPSTR pszDisplayName,指定一個緩衝區,接收使用者選擇的目錄的顯示名稱
	LPCSTR lpszTitle,樹形檢視上方顯示的文字
	UINT ulFlags,指定屬性
	BFFCALLBACK Lpfn,指定回撥函式,發生某些事件時,指定的函式被呼叫,允許程式進一步定製對話方塊的行為
	LPARAM lParam,若指定回撥函式,引數值傳遞給回撥函式
	int iImage,代表使用者選擇的資料夾物件的圖示在系統圖標列表中的索引 
*/

int main()
{ 
	BROWSEINFO bi; 
	::ZeroMemory(&bi,sizeof(bi));   //將bi結構清零  
	char szSelPath[MAX_PATH];       //被選擇資料夾物件名稱的緩衝區 
	bi.pszDisplayName=szSelPath; 
	LPITEMIDLIST pNetHoodIDL; 

	::SHGetSpecialFolderLocation(NULL,CSIDL_HISTORY,&pNetHoodIDL);  //根資料夾為歷史資料夾 
	bi.pidlRoot=pNetHoodIDL; bi.lpszTitle="zengwenwu ";    //提示字串 
	bi.ulFlags=BIF_BROWSEINCLUDEFILES|    //允許選擇檔案物件  
		BIF_EDITBOX|                        //顯示編輯框  
		BIF_STATUSTEXT|                     //顯示狀態文字  
		BIF_VALIDATE;                       //校驗編輯框中的輸入  
	LPITEMIDLIST pidlSel=::SHBrowseForFolder(&bi);    //開啟資料夾瀏覽對話方塊 
	
	if(pidlSel!=NULL) 
	{  
		cout<<"Selected:"<<szSelPath<<endl;  
		CComPtr<IMalloc> pMalloc;  
		::SHGetMalloc(&pMalloc);  
		pMalloc->Free(pidlSel);   //釋放資源 
	} 
	
	return 0;
}


//選擇目錄按鈕
void CDcPackerDlg::OnBnClickedDecgen()    
{
    char szPath[MAX_PATH];     //存放選擇的目錄路徑 
    CString str;
	
    ZeroMemory(szPath, sizeof(szPath));   
	
    BROWSEINFO bi;   
    bi.hwndOwner = m_hWnd;   
    bi.pidlRoot = NULL;   
    bi.pszDisplayName = szPath;   
    bi.lpszTitle = "請選擇需要打包的目錄:";   
    bi.ulFlags = 0;   
    bi.lpfn = NULL;   
    bi.lParam = 0;   
    bi.iImage = 0;   
    //彈出選擇目錄對話方塊
    LPITEMIDLIST lp = SHBrowseForFolder(&bi);   
	
    if(lp && SHGetPathFromIDList(lp, szPath))   
    {
        str.Format("選擇的目錄為 %s",  szPath);
        AfxMessageBox(str); 
		
        
    }
    else   
        AfxMessageBox("無效的目錄,請重新選擇");   
}

//選擇檔案對話方塊

CString CDcPackerDlg::BootOpenDialog()   //返回選擇的檔名稱
{
    CString strFile = _T("");
	
    CFileDialog    dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.cfg)|*.cfg|All Files (*.*)|*.*||"), NULL);
	
    if (dlgFile.DoModal())
    {
        strFile = dlgFile.GetPathName();
    }
	
    return strFile;
}

//載入檔案按鈕
void CDcPackerDlg::OnBnClickedSelectdec()
{
    // TODO: Add your control notification handler code here
    m_strDescPath = "";        //類的成員變數
	
    //"開啟檔案"對話方塊,選擇檔案,返回其路徑
    m_strDescPath = BootOpenDialog();
	
    
}


相關推薦

[MFC]目錄選擇檔案選擇

最近專案中有下面需求: 1.  彈出目錄或檔案選擇對話方塊 2. 當選中目錄時將該目錄下所有.c檔案的絕對路徑獲取出來 3. 當選中檔案時,判斷是否是.c檔案,如果是.c檔案將該.c檔案絕對路徑獲取出來 4. 支援多選目錄         5. 支援多選檔案 6. 支援

選擇努力 選擇尊嚴

mil 工作 sim 後來 最好的 生活 font 質量 最好 沒選擇的時候痛苦,有選擇的時候更痛苦,只有最佳選擇才是好,所以要做好當下最好的自己。當下的選擇與努力,決定著未來3年,5年,10年工作和生活的質量狀態。當然,當下的努力與拼搏,也是讓自已後來有更多的選擇,有更好

prototype.js框架 dom操作(checkout選擇取消選擇操作DOM)

作者:zccst需求:使用者點選checkbox時,如果選擇,則讓其子型別checkbox變成灰色。如果取消選擇,再讓子型別checkbox變成正常可選狀態。分析:用到知識點1,選擇器。找到目標dom節點2,如何判斷是目標標籤3,找到目標標籤後,如果選擇,則設定子型別屬性di

最近生活感悟,我的選擇選擇

選擇與被選擇 今天同學的妹妹不遠萬里從老家跑過來問我要不要培訓,然後進入IT行業。談了很長時間,最後我給出的建議是“做自己的選擇,堅持自己喜歡的事情就是對的。” 回家的路上不禁想起去年自己在臨近畢業時所面臨選擇的問題。當然可能對於我來說我更加的幸運一些,因為

Winform選擇目錄路徑選擇文件路徑

mod .data tle tail info pan ext dialog lena https://blog.csdn.net/zaocha321/article/details/52528279 using System.Collections.Generi

STM32 晶片系列 巨集定義啟動檔案選擇說明

其中,ld.s適用於小容量 產品;md.s適用於中等容量產品;hd適用於大容量產品; 1、小容量產品:STM32F10X_LD,USE_STDPERIPH_DRIVER         C4/C6 R4/R6  T4/

QT工程檔案的條件編譯選擇額外的編譯引數配置

QTCreator開啟.pro工程檔案後,依據不同的構建套件建立專案組。在專案組中,點開構建步驟的“詳情”,增加一個自己的巨集定義,比如: DEFINES+=IMX_287 然後,我們在.pro檔案中新增: contains(DEFINES,IMX_2

選擇目錄對話方塊和選擇檔案對話方塊——CFileDialog

網上相關文章很多,現簡單整理如下 1、CFileDialog建構函式 1 CFileDialog:CFileDialog(BOOL     bOpenFileDialog, 2 LPCTSTR     lpszDefExt=NULL, 3 LPCTSTR

MFC點選按鈕開啟檔案選擇對話方塊

函式名:OnBnClickedOpenFileButton 函式功能:通過點選一個按鈕實現開啟檔案選擇對話方塊 引數:無 返回值:void 作者:weekdawn void CexeDemoDlg:

MFC檔案選擇

檔案對話方塊例項 根據前面所講內容,雞啄米給大家做個檔案對話方塊例項。        1.建立一個基於對話方塊的MFC應用程式工程,名稱設為“Example17”。        2.修改主對話方塊IDD_EXAMPLE17_DIALOG的模板,刪除自動生成的“TODO:

【C#】檔案選擇對話方塊OpenFileDialog下列列表ComboBox

主要用如下的一個小例子,說明C#窗體中檔案選擇對話方塊OpenFileDialog與下列列表ComboBox的應用,點選“選擇檔案”按鈕,就可以開啟檔案選擇對話方塊OpenFileDialog,無論是多選檔案與單選檔案,都能夠將選擇的內容新增到下列列表ComboBox之中。

QT-檔案選擇對話方塊的模態非模態

        模態對話方塊與非模態對話方塊的基本概念就不詳說了,簡單說一下:                模態對話方塊彈出時,主視窗被阻塞,簡單來說就是如果該對話方塊不關閉,則主視窗上的按鈕都不可用;                非模態對話方塊反之。       那麼

yii2布局選擇屬性標簽設置

attribute style 大小 app generate password 優先 first nds Yii選擇布局的方法: 1. 通過控制器成員變量設置: public $layout = false;//不使用布局 public $layout = ‘main’;

ThreadPoolExecutor中策略的選擇工作隊列的選擇(java線程池)

完全 系統 rod 大小 font 操作系統 重復 null 定義 工作原理 1、線程池剛創建時,裏面沒有一個線程。任務隊列是作為參數傳進來的。不過,就算隊列裏面有任務,線程池也不會馬上執行它們。 2、當調用 execute() 方法添加一個任務時,線程池會做如下判斷:

html class選擇id選擇

spa 寫法 錯誤 一個 html nbsp 元素 -s cnblogs class選擇器: <p class="p1"> .p1{ color:red; ..... } id選擇器: <p id="p2"> #p1{

Css 後代選擇子代選擇器的區別

javascrip width 沒有 什麽 for -1 adding 選擇器 light 後代選擇器用空格,比如A B{border:1px solid red;} 子代選擇器用>, 比如A>B{border:1px solid red;} 但是,如果你仔

關於用$.Ajax()控制按鈕的選擇查看

public 當前 tom rri boolean protected exceptio cep let 前端jsp頁面代碼: 請選擇版本:<br/><div>推送版本:<input type="button" id="post1" clas

細品 - 過擬合模型選擇*

最優 優化 並且 情況下 最小化 wid 正方 tro 預測 欠擬合和過擬合   欠擬合是指模型不能很好的捕獲到數據特征,不能很好的擬合數據,學習能力底下。解決方法:增加模型的復雜度        過擬合是指模型不僅僅學習了數據集中的有效信息,也學習到了其中的噪音數據,使得

基本統計方法的選擇應用

sample bsp 應用 描述 推斷 post 趨勢 相關分析 賦值 一、確定資料的類型:分類資料、定量資料; 選擇適當的統計方法,資料不同,設計不同,采用的分析方法不同;1、計量資料的比較(比較集中趨勢是否不同): (1)兩組:t檢驗、Wilcoxon

(轉)磁盤分區類型選擇磁盤分區配置過程

多個 網站集群架構 設備名 不可 primary lvm 創建文件系統 alt 再次 2.3.2 磁盤分區類型選擇與磁盤分區配置過程(1) 原文:http://book.51cto.com/art/201701/527364.htm 《跟老男孩學Linux運維:Web集群