选择文件夹的对话框

简介: 选择文件夹的对话框

1,分析

1,弹出对话框让用户选择一个合适的文件夹(或文件).

 

 

2,将用户选择的文件夹或文件记录在ini(或注册表)中,下次直接定位到此文件夹或文件.

 

 

3,用户可以指定关联窗口(一般是编辑框).如果不将内容写进注册表,则初始文件夹为编辑框的内容.用户选择结束后,将用户的选择显示在关联窗口上.

 

 

2,设计

2.1,父窗口:

如果对话框A上有一个按钮B,用户点击B,会弹出文件夹对话框,那么文件夹对话框的父窗口为A.否则用户可以点击A上的其它按钮,造成不可预料的错误.

如果用户指定了父窗口,就以用户指定的窗口为父窗口.

如果用户关联了控件,就以控件的父窗口为父窗口.

如果存在主窗口,就以主窗口为父窗口,否则父窗口为NULL.

 

2.2,ini(或注册表)内容:

用两个成员变量,记录节名(m_strIniAppName)和属性名(m_strIniKeyName).如果属性名或节名为空,则不存进ini或注册表.

属性名默认值为空,如果想存进ini,必须指定属性名.

节名的默认值为"文件夹初始路径"

 

2.3,标题

如果用户指定了标题,则用用户指定的标题.

如果用户指定了注册表的属性名,则标题为”请为%s选择合适的目录:”,%s表示ini的属性名.

否则标题为"请选择合适的目录:"

如果想让标题为空,可指定标题为一个空格.

 

2.4初始路径

如果用户指定了初始路径,显示用户指定的路径.

如果用户将上次选择的路径存储在ini,则从ini中读取.

如果关联了控件,以此控件的内容为初始路径.

否则初始路径为空.

2.5,风格目前只有两种:

SD_DIR        :只显示文件夹

SD_DIR_FILE   :显示文件夹和文件

 

2.6,如果文件夹太长则显示部分

: 盘符+1到6个"." + 最后一级文件夹或文件

 

3,实现

enum Flag{SD_DIR=1,SD_DIR_FILE=3};
class  CDirectoryDialog 
{  
public:
    CDirectoryDialog();
    CDirectoryDialog(CString strIniKeyName);
    virtual ~CDirectoryDialog();
    //弹出一个对话框,让用户选择文件夹
    CString ShowDirectoryTree(CWnd *pBuddyWnd);//入口参数是相关联的窗口
    CString ShowDirectoryTree(CString strIniDir="");//入口参数是初如值
    //写或读取注册表(或ini)中的值
    void SetDefaultDirectory(CString strDefaultDirectory);
    CString GetDefaultDirectory();
    HWND       m_hwndOwner; //父窗口句柄   
    CString       m_strTitle;  //标题
enum Flag  m_ulFlags;
   //SD_DIR,值为1,只显示文件夹;SD_DIR_FILE,值为3显示文件和文件夹,默认只显示文件夹 
    //注册表或ini文件的相关信息,记录上次打开的文件夹
    CString m_strIniAppName ;
    CString m_strIniKeyName ;
private:
    void init();//初化成员变量
    static CString GetShortDir(CString strDir,long nMaxLength =45);//将长路径名转化成短路径名
    UINT GetStyle(enum Flag flag);//将风格转化成SHBrowseForFolder的风格
    CString GetDefaultTitle();//得到默认标题
    HWND GetDefaultOwnerHwnd();//得到默认窗口
    //回调函数,由SHBrowseForFolder调用
    static int CALLBACK  BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData);
};

4,用到的系统函数简介

1,调用API函数, WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(

 

 

LPBROWSEINFO lpbi);

 

 

其参数lpbi成员的意义为(参照下图)

 

hwndOwner          : 父窗口的句柄.
PidlRoot           : 根目录.
PszDisplayName     : 用户选择的文件夹.
lpszTitle          : 标题
ulFlags            : 风格
lpfn               : 回调函数
      lParam             : 回调函数的参数.
      iImage              : 用户选择的文件夹的图标.

 


 

注意:静态文本框的内容不是系统处理的.

5,使用

5.1与编辑框关联,不写进注册表

void CTestSDDlg::OnBrowse()
{
    CDirectoryDialog DirDlg;
    DirDlg.ShowDirectoryTree(GetDlgItem(IDC_BROWSE_EDIT));
}

5.2写进注册表

void CTestSDDlg::OnBrowse1()
{
         CDirectoryDialog DirDlg("key1");
         DirDlg.m_hwndOwner = GetSafeHwnd();
         CString strDir = DirDlg.ShowDirectoryTree("");
         if(!strDir.IsEmpty())
         AfxMessageBox("你选择的文件是:"+strDir);
}

附录:

头文件

http://www.338888.com/VCShare/TestSD/DirectoryDialog.h

源文件

http://www.338888.com/VCShare/TestSD/DirectoryDialog.cpp

示范工程:

http://www.338888.com/VCShare/TestSD/TestSD.rar


相关文章
|
6月前
|
存储 关系型数据库 MySQL
【免费动手教程上线】阿里云RDS MySQL推出大容量高性能存储:高性能本地盘(最高16TB存储空间)、高性能云盘(最高64TB存储空间)
阿里云RDS MySQL提供高性能本地盘与高性能云盘等存储方案,满足用户大容量、低延迟需求。高性能本地盘单盘最大16TB,IO延时微秒级;高性能云盘兼容ESSD特性,支持IO性能突发、BPE及16K原子写等能力。此外,阿里云还提供免费动手体验教程,帮助用户直观感受云数据库 RDS 存储性能表现。
|
SQL Oracle 关系型数据库
SQL SELECT TOP 详解
SQL SELECT TOP 详解
|
机器学习/深度学习 自然语言处理 Python
Word2Vec
Word2Vec是由Google在2013年提出的词嵌入模型,能将词语转化为捕捉语义和句法关系的向量。它包含CBOW和Skip-Gram两种模型,分别通过上下文预测目标词或反之。Word2Vec在文本分类、情感分析等领域广泛应用,并可通过gensim等工具轻松实现。
240 1
|
机器学习/深度学习 人工智能 运维
电话机器人源码-智能ai系统-freeswitch-smartivr呼叫中心-crm
电话机器人源码-智能ai系统-freeswitch-smartivr呼叫中心-crm
462 0
|
监控 安全 数据安全/隐私保护
ERP系统中的组织架构与权限管理解析
【7月更文挑战第25天】 ERP系统中的组织架构与权限管理解析
1347 2
|
传感器 机器学习/深度学习 自动驾驶
自动驾驶中的感知模型:实现安全和智能驾驶的关键
自动驾驶中的感知模型:实现安全和智能驾驶的关键
383 9
|
消息中间件 分布式计算 关系型数据库
使用Apache Spark从MySQL到Kafka再到HDFS的数据转移
使用Apache Spark从MySQL到Kafka再到HDFS的数据转移
239 0
|
监控 前端开发 JavaScript
【面试题】5年前端 - 历时1个月收获7个offer
【面试题】5年前端 - 历时1个月收获7个offer
1071 0
|
JSON Android开发 数据格式
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
732 1
|
人工智能 文字识别 开发者
CogVLM智谱AI 新一代多模态大模型发布,魔搭社区最佳实践体验!
继 5 月 18 日推出 VisualGLM-6B 后,智谱AI&清华KEG 潜心打磨,于近日发布并直接开源了更强大的多模态大模型——CogVLM-17B。模型已第一时间发布在魔搭社区,可体验!