📄 directorydialog.cpp
字号:
#include "stdafx.h"
#include "DirectoryDialog.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDirectoryDialog::CDirectoryDialog()
{
init();
}
CDirectoryDialog::CDirectoryDialog(CString strIniKeyName)
{
init();
m_strIniKeyName = strIniKeyName ;
}
CDirectoryDialog::~CDirectoryDialog()
{
}
int CALLBACK CDirectoryDialog::BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
switch(uMsg)
{
case BFFM_INITIALIZED:
//根据lpData选择初始文件夹
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData);
return 1 ;
case BFFM_SELCHANGED:
{
char szDir[1000];
if (SHGetPathFromIDList((LPITEMIDLIST) lParam ,szDir))
{
//将选择的文件夹显示在静态文本框上,如果太长只显示开头和结尾
SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)(LPCTSTR)GetShortDir(szDir));
}
}
return 1 ;
default:
break;
}
return 1 ;
}
/////////////////////////////////////////////////////////////////////////
// 函数名称: CDirectoryDialog::ShowDirectoryTree
// 函数说明: 弹出系统对话框让用户选择一个合适的文件夹或文件
// 入口参数: 初始路径
// 返回值 : 用户选择的路径,取消返回空串
/////////////////////////////////////////////////////////////////////////
CString CDirectoryDialog::ShowDirectoryTree(CString strIniDir)
{
CString strPath;//记录用户选择的文件夹
char pszTemp[1000] = {""};
char pszTitle[1000] = {""};//标题
if(NULL == m_hwndOwner)//为空,得到默认的父句柄
m_hwndOwner = GetDefaultOwnerHwnd();
if(m_strTitle.IsEmpty())//为空,得到默认的标题
m_strTitle = GetDefaultTitle();
BROWSEINFOA bi ={0};
char pszDisplayName[MAX_PATH] = "\0";//存储用户的选择
bi.hwndOwner=m_hwndOwner;
bi.pszDisplayName = pszDisplayName;
bi.ulFlags = GetStyle(m_ulFlags);
bi.lpszTitle = m_strTitle ;
bi.lpfn = BrowseCallbackProc ;
if(strIniDir.IsEmpty())
strcpy(pszTemp,(LPCTSTR)(AfxGetApp()->GetProfileString(m_strIniAppName,m_strIniKeyName,"")));
else
strcpy(pszTemp,strIniDir);
bi.lParam = (int)pszTemp ;
LPITEMIDLIST lpIL = SHBrowseForFolder(&bi);
if(lpIL)
{
SHGetPathFromIDList(lpIL,bi.pszDisplayName);
}
else
return "";
//如果不是以"\\"结尾,加上"\\"
strPath = bi.pszDisplayName;
if(strPath.Right(1)!='\\')
strPath += "\\";
//将文件夹存进注册表或ini
SetDefaultDirectory(strPath);
return strPath ;
}
CString CDirectoryDialog::GetDefaultDirectory()
{
//m_strIniAppName或m_strIniKeyName为空,不存进注册表
if(m_strIniAppName.IsEmpty() || m_strIniKeyName.IsEmpty())
return "";
return AfxGetApp()->GetProfileString(m_strIniAppName,m_strIniKeyName,"");
}
void CDirectoryDialog::SetDefaultDirectory(CString strDefaultDirectory)
{
//m_strIniAppName或m_strIniKeyName为空,不存进注册表
if(m_strIniAppName.IsEmpty() || m_strIniKeyName.IsEmpty())
{
ASSERT(false);
return ;
}
AfxGetApp()->WriteProfileString(m_strIniAppName,m_strIniKeyName,strDefaultDirectory);
}
void CDirectoryDialog::init()
{
m_hwndOwner = NULL;
m_strTitle.Empty();
m_ulFlags = SD_DIR;
m_strIniAppName = "文件夹初始路径";
m_strIniKeyName.Empty();
}
/////////////////////////////////////////////////////////////////////////
// 函数名称: CDirectoryDialog::GetShortDir
// 函数说明: 将长路径转成短路径;短路径=盘符+1到6个"." + 最后一级文件夹或文件
// 入口参数: 长路径名,最长长度
/////////////////////////////////////////////////////////////////////////
CString CDirectoryDialog::GetShortDir(CString strDir,long nMaxLength/*=45*/)
{
ASSERT(nMaxLength > 5);
if(strDir.GetLength() < nMaxLength)//没有超过长,不用处理
return strDir ;
CString strShortDir;
//如果有盘符(如c:\)加上盘符
if(':'==strDir[1] && '\\'==strDir[2])
strShortDir = strDir.Left(3);
CString strLastDir ;//取最后一级文件夹或文件
int nPos = strDir.ReverseFind('\\');
if(nPos != -1)
strLastDir = strDir.Mid(nPos);
if(strLastDir > nMaxLength - 5 )
{
strLastDir = strLastDir.Mid(strLastDir.GetLength() - (nMaxLength - 5));
if('\\' != strLastDir[0])
strLastDir = '\\' + strLastDir ;
}
//中间加上若干...,最多六个
int nSpace = nMaxLength - strShortDir.GetLength() - strLastDir.GetLength() ;
if(nSpace > 6)
nSpace = 6;
for(int i = 0 ; i< nSpace ; i++)
strShortDir +=".";
strShortDir += strLastDir ;
return strShortDir ;
}
/////////////////////////////////////////////////////////////////////////
// 函数名称: CDirectoryDialog::ShowDirectoryTree
// 函数说明: 弹出系统对话框让用户选择一个路径
// 入口参数: 入口参数关联窗口
// 如果父句柄为空,则父句柄为关联控件的父窗口
// 如果不将选择的路径写进ini,此用关联控件的值为初始值
// 将用户选择的值显示在关联控件上,并更新其关联变量
/////////////////////////////////////////////////////////////////////////
CString CDirectoryDialog::ShowDirectoryTree(CWnd *pBuddyWnd)
{
if(NULL == pBuddyWnd)
{
ASSERT(false);
return "" ;
}
CString strDir ;
if(NULL == m_hwndOwner)//以关联控件的父窗口为父窗口
if(NULL != pBuddyWnd->GetParent())
m_hwndOwner = pBuddyWnd->GetParent()->GetSafeHwnd();
if(m_strIniKeyName.IsEmpty())//如果没有将上次的路径写进注册表,初始值为关联控件的内容
pBuddyWnd->GetWindowText(strDir);
strDir = ShowDirectoryTree(strDir);
if(!strDir.IsEmpty())
{//更新关联控件的显示及关联变量的值
pBuddyWnd->SetWindowText(strDir);
if(NULL != pBuddyWnd->GetParent())
pBuddyWnd->GetParent()->UpdateData(true);
}
return strDir ;
}
HWND CDirectoryDialog::GetDefaultOwnerHwnd()
{
return AfxGetMainWnd()->GetSafeHwnd();//主框架的句柄
}
CString CDirectoryDialog::GetDefaultTitle()
{
CString strTitle ;
if(m_strIniKeyName.IsEmpty())
strTitle = "请选择合适的目录:";
else
{
char pszTitle[255];
sprintf(pszTitle,"请为%s选择合适的目录:",m_strIniKeyName);
strTitle = pszTitle ;
}
return strTitle ;
}
UINT CDirectoryDialog::GetStyle(enum Flag flag)
{
switch(flag)
{
case SD_DIR : return BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT ;//只显示文件夹
case SD_DIR_FILE : return BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT|BIF_BROWSEINCLUDEFILES;//显示文件夹和文件
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -