MFC-打开文件对话框和文件拖拽功能的实现

一,打开文件对话框

(1)创建一个基于对话框的MFC应用程序工程,名称设为“COpenFile”。

(2)添加两个编辑框,ID分别为IDC_OPEN_EDIT和IDC_SAVE_EDIT;

再添加两个按钮,ID分别设为IDC_OPEN_BUTTON和IDC_SAVE_BUTTON ,,标题分别设为“打开”和“保存”。

 (3)为按钮IDC_OPEN_BUTTON添加点击消息的消息处理函数

 出现以下函数:

(4)为按钮IDC_SAVE_BUTTON添加点击消息的消息处理函数

(5)修改“打开”按钮的休息处理函数

void CCOpenFileDlg::OnBnClickedOpenButton()
{
	// TODO: 在此添加控件通知处理程序代码

	// TODO: Add your control notification handler code here   
	// 设置过滤器   
	TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");
	// 构造打开文件对话框   
	CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
	CString strFilePath;

	// 显示打开文件对话框   
	if (IDOK == fileDlg.DoModal())
	{
		// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里   
		strFilePath = fileDlg.GetPathName();
		SetDlgItemText(IDC_OPEN_EDIT, strFilePath);
	}

}

关于CFileDialog类的函数:

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

 bOpenFileDialog:指定要创建的文件对话框的类型设为TRUE将创建打开文件对话框,否则将创建保存文件对话框在这里我们设置为真。

lpszDefExt:。默认的文件扩展名如果用户在文件名编辑框中没有输入扩展名,则由lpszDefExt指定的扩展名将被自动添加到文件名后默认为NULL在这里我们设置为_T(“TXT”) 。

lpszFileName:。文件名编辑框中显示的初始文件名如果为NULL,则不显示初始文件名我们设为NULL。

 的dwFlags中:文件对话框的属性,可以是一个值也可以是多个值的组合关于属性值的定义,可以在MSDN中查找结构体OPENFILENAME,元素标志的说明中包含了所有属性值默认为OFN_HIDEREADONLY和OFN_OVERWRITEPROMPT的组合,OFN_HIDEREADONLY表示隐藏文件对话框上的“只读”复选框,OFN_OVERWRITEPROMPT表示在保存文件对话框中如果你选择的文件存在了,就弹出一个消息对话框,要求确定是否要覆盖此文件。我们设为0。

lpszFilter:。文件过滤器,它是由若干字符串对组成的一个字符串序列如果指定了文件过滤器,则文件对话框中只有符合过滤条件的文件显示在文件列表中待选择我们输入szFilter

 pParentWnd:文件对话框的父窗口的指针我们输入这个

GetPathName函数:

获得选定文件的路径全名。

SetDlgItemText函数:

将获得的路径名strFilePath发送到IDC_OPEN_EDIT的编辑框中。

的的DoModal函数:

文件对话框是模态对话框,所以在打开时也需要调用的CFileDialog的类的的的DoModal()成员函数。

(6)同理,为OnBnClickedSaveButton()添加代码

void CCOpenFileDlg::OnBnClickedSaveButton()
{
	// TODO: 在此添加控件通知处理程序代码

	// 设置过滤器   
	TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*||");
	// 构造保存文件对话框   
	CFileDialog fileDlg(FALSE, _T("doc"), _T("my"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);
	CString strFilePath;

	// 显示保存文件对话框   
	if (IDOK == fileDlg.DoModal())
	{
		// 如果点击了文件对话框上的“保存”按钮,则将选择的文件路径显示到编辑框里   
		strFilePath = fileDlg.GetPathName();
		SetDlgItemText(IDC_SAVE_EDIT, strFilePath);
	}
}

(7)效果

二,实现文件拖拽功能

(1)选中对话框中的acceptFiles属性,设置为真

(2)添加OnDropFiles消息响应函数

文件中出现以下代码:

 (3)为编辑框添加成员m_szPath,类型为CString的,私人

为响应消息函数void CCOpenFileDlg :: OnDropFiles(HDROP hDropInfo)添加代码:

void CCOpenFileDlg::OnDropFiles(HDROP hDropInfo)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	UINT count;
	TCHAR filePath[MAX_PATH] = { 0 };

	count = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);//从成功的拖放操作中检索文件的名称。并取代被拖拽文件的数目
	if (count == 1)//如果只拖拽一个文件夹
	{
		DragQueryFile(hDropInfo, 0, filePath, sizeof(filePath));//获得拖拽的文件名
		m_szPath = filePath;
		UpdateData(FALSE);
		DragFinish(hDropInfo);//拖放成功后,释放内存

		CDialog::OnDropFiles(hDropInfo);
		return;

	}
	else//如果拖拽多个文件夹
	{
		//m_vectorFile.clear();
		for (UINT i = 0; i<count; i++)
		{
			int pathLen = DragQueryFile(hDropInfo, i, filePath, sizeof(filePath));
			m_szPath = filePath;
			//m_vectorFile.push_back(filePath);
			//break;
		}

		UpdateData(FALSE);
		DragFinish(hDropInfo);
	}


	CDialogEx::OnDropFiles(hDropInfo);
}

DragQueryFile函数:

UINT DragQueryFile(         
    HDROP hDrop,
    UINT iFile,
    LPTSTR lpszFile,
    UINT cch
);

   HDROP参数:包含删除文件的文件名的结构的标识符。

  iFile的参数:查询的文件索引如果iFile的参数的值是0xFFFFFFFF的,则DragQueryFile会返回拖拽的文件的计数。

  lpszFile参数:当函数返回时,缓冲区的地址将接收拖拽文件的文件名如果该参数为NULL,DragQueryFile将返回所需的尺寸,即缓冲区中的字符。

  CCH参数:大小,字符,lpszFile缓冲区的大小。

DragFinish函数:释放系统分配的内存,用于将文件名传递给应用程序。

OnDropFiles函数:当用户在一个已经注册为删除文件的接收者的窗口上释放鼠标左键时,这个框架调用这个成员函数。

(4)编译,发现出错,需要强制类型转换

效果(注意:需要将文件拖拽到对话框的中央或内部)

参考资料:

1. HTTP//www.jizhuomi.com/school/c/166.html 

2. https://ke.qq.com/course/253301

猜你喜欢

转载自blog.csdn.net/qq_40416052/article/details/81940683