⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directorydialog.cpp

📁 串口程序源码
💻 CPP
字号:
#include "stdafx.h"
#include "DirectoryDialog.h"

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 ;
	}
	return 1 ;
}

/////////////////////////////////////////////////////////////////////////
//  函数名称: CDirectoryDialog::ShowDirectoryTree
//  函数说明: 弹出系统对话框让用户选择一个合适的文件夹或文件
//  入口参数: 初始路径
//  返回值  : 用户选择的路径,取消返回空串
/////////////////////////////////////////////////////////////////////////
CString CDirectoryDialog::ShowDirectoryTree(CString strIniDir)
{
	CString strPath;//记录用户选择的文件夹
	char pszTemp[1000] = {""};
	char pszTitle[1000] = {""};//标题
	
	if(NULL == m_hwndOwner)		m_hwndOwner = AfxGetMainWnd()->GetSafeHwnd();
	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 += "\\";
	SetDefaultDirectory(strPath);//将文件夹存进注册表或ini
	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 ;
	strLastDir.Empty();
	return strShortDir ;	
}

/////////////////////////////////////////////////////////////////////////
//  函数名称: CDirectoryDialog::ShowDirectoryTree
//  函数说明: 弹出系统对话框让用户选择一个路径
//  入口参数: 入口参数关联窗口
//  如果父句柄为空,则父句柄为关联控件的父窗口
//	如果不将选择的路径写进ini,此用关联控件的值为初始值
//	将用户选择的值显示在关联控件上,并更新其关联变量
/////////////////////////////////////////////////////////////////////////
CString CDirectoryDialog::ShowDirectoryTree(CWnd *pBuddyWnd)
{
	if(NULL == pBuddyWnd)	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 ;
}

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;//显示文件夹和文件
	}
	return BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT ;//只显示文件夹
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -