您的位置:首页 > 其它

打开文件对话框使用实例

2012-11-29 21:06 183 查看
1、打开文件对话框属于Windows通用对话框!

2、使用API函数GetOpenFileName可以显示打开文件对话框并返回所选文件。

3、MFC对GetOpenFileName的封装类为CFileDialog。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

1、建立基于对话框的MFC应用程序OpenFileDemo

2、在主对话框上添加一个文本框,其ID为IDC_EDT_RESULT,并选中"Horizontal scroll"、"Vertical scroll"、"Multiline"

3、在主对话框上添加一个Check Box控件,文本修改为“多选” , ID改为IDC_CHK_MULTISEL,并关联控件型变量m_chkMultiSel。

4、将主对话框上“确定”按钮改为“SDK”,ID改为ID_BTN_SDK

5、将“取消”按钮改为“MFC”,ID改为IDC_BTN_MFC

///SDK方式调用打开文件对话框处理函数、
void COpenFileDemoDlg::OnBtnSdk() 
{
	// TODO: Add your control notification handler code here
		// TODO: Add extra validation here
	///存放文件的缓冲
	TCHAR szBuffer[MAX_PATH*10] = {0};
	///初始化结构
	OPENFILENAME ofn = {0};
	ofn.lStructSize = sizeof(ofn);
	ofn.hwndOwner = m_hWnd;
	///MFC使用"|"作为分隔符,而SDK使用"\0"作为分隔符
	ofn.lpstrFilter = _T("文本文件(*.txt)\0*.txt\0所有文件(*.*)\0*.*\0");
	ofn.lpstrInitialDir = _T("c:\\");
	ofn.lpstrFile = szBuffer;
	ofn.nMaxFile = sizeof(szBuffer) / sizeof( *szBuffer);
	ofn.nFilterIndex = 0 ;
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;
	///如果多选,加上多选标记
	if(m_chkMultiSel.GetCheck())
		ofn.Flags |= OFN_ALLOWMULTISELECT;
	////*************************
	///显示打开文件对话框
	//******************************
	BOOL bSel = GetOpenFileName(&ofn);
	if(!bSel)
	{
		SetDlgItemText(IDC_EDT_RESULT ,_T("选择被取消\n"));
		return ;
	}

	///获得所选文件
	if(m_chkMultiSel.GetCheck())
	{
		////如果有多选标志,缓冲区第一节为路径,文件名在路径后
		TCHAR szPath[MAX_PATH] = {0};
		CString str;
		int nLen ; 
		TCHAR *p = ofn.lpstrFile + ofn.nFileOffset ;
		_tcsncpy(szPath , ofn.lpstrFile , ofn.nFileOffset );
		if(szPath[ofn.nFileOffset - 1 ] != '\\')
		{
			_tcscat(szPath , _T("\\" ));
		}

		while(true)
		{
			nLen = _tcslen(p);
			if(nLen == 0)
				break;
			str += szPath;
			str += p ;
			str += _T("\r\n");
			p += nLen + 1;                                            
		}
		SetDlgItemTex(IDC_EDT_RESULT, str);
	}
	else
	{
		///如果没有多选标志,缓冲区内为完整文件名
		SetDlgItemText(IDC_EDT_RESULT,szBuffer);
	}
}




///MFC方式调用打开文件对话框响应函数
void COpenFileDemoDlg::OnBtnMfc() 
{
	// TODO: Add your control notification handler code here
	 ///定义缓冲和对话框    
	TCHAR szBuffer[MAX_PATH*10] = {0};
	CFileDialog dlg(TRUE , NULL ,NULL , OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST ,
		_T("文本文件(*.txt) | *.txt | 所有文件(*.*)|*.*||") ,this);
	dlg.m_ofn.lpstrInitialDir = _T("c:\\");

	///如果多选,需要给对话框分配更大的缓冲区以保证更多的文件名
	if(m_chkMultiSel.GetCheck())
	{
///给对话框的m_ofn成员重新分配一个更大的缓冲区来接受文件名。否则在文件名加起来超过260个字符时,函数就会调用失败
		dlg.m_ofn.lpstrFile = szBuffer;
		dlg.m_ofn.nMaxFile = sizeof(szBuffer) / sizeof(*szBuffer);
		dlg.m_ofn.Flags |= OFN_ALLOWMULTISELECT;
	}
	///显示对话框
	if(dlg.DoModal() != IDOK)
	{
		SetDlgItemText(IDC_EDT_RESULT ,_T("选择被取消."));
		return ; 
	}

	///得到所选文件
	if(m_chkMultiSel.GetCheck())
	{
		///如果有多选标志,需要用循环获取文件名
		CString strFile;
		POSITION pos = dlg.GetStartPosition();
		while(pos)
		{
			strFile += dlg.GetNextPathName(pos);
			strFile += _T("\r\n");
		}
		SetDlgItemText(IDC_EDT_RESULT ,strFile);
	}
	else
	{
		///如果没有所选标志,可以直接获得文件名
		SetDlgItemText(IDC_EDT_RESULT ,dlg.GetPathName());
	}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: