通过GetOpenFileName函数可在在VS2010程序中创建一个对话框然后选择一个文件载入到程序中(获取文件信息保存到程序中)。在windows之上运行的程序,这个过程一般是弹出一个对话框,在对话框的下拉菜单中选择需要选择的文件,然后将文件载入程序中。实现此功能主要包含两个部分,第一个部分是OPENFILENAME结构体设置,包括用来设置弹出对话框的属性及保存载入的文件名;第二部分就是调用GetOpenFileName函数来载入文件。简要记录这两个部分的实现
打开文件对话框就是供用户选择要载入文件的路径的,是人机交互的一个对话框。采用OPENFILENAME结构体来初始化。
元素 |
描述 |
赋值 |
lStructSize |
此结构体大小,以字节为单位 |
Sizeof(OPENFILENAME) |
lpstrFilter |
在对话框选中选择择文件的过滤文件类型。效果如后图 |
TEXT("Video Files (.ASF, .AVI, .MPG, .MPEG, .VOB, .QT, .WMV)\0*.ASF;*.AVI;*.MPG;*.MPEG;*.VOB;*.QT;*.WMV\0") \ TEXT("All Files (*.*)\0*.*\0\0"); |
nFilterIndex |
文件过滤器的索引值(在不设置自定义过滤器的条件下) |
1 |
lpstrFile |
用来保存载入文件的路径和文件名 |
szBuffer(TCHAR szBuffer[256]) |
nMaxFile |
用来对应载入文件名的最大长度,一般为lpstrFile赋值数组的长度 |
256 |
lpstrTitle |
对话框的标题 |
TEXT("Select a video to play") |
Flags |
位标记的设置。当对话框返回时,根据设置的位标记指出用户的输入,如OFN_CREATEPROMPT表示当用户输入了一个不存在的文件时,对话框返回时提示是否要新建这个文件 |
OFN_HIDEREADONLY |
lpstrDefExt |
如果用户没有输入文件扩展名,选择文件的默认扩展名(后缀名) |
TXT("AVI") |
OPENFILENAME结构体还包含其它的元素,这里只是记录最常用和必须要赋值的,其它的可以设置为空或者0即可。在上表中的元素对应的对话框的项如下图所示
图1 OPENFILENAME结构体元素对应对话框属性图
函数原型:BOOLWINAPR GetOpenFileName(_Inout_LPOPENFILENAME lpofn)
函数功能:创建一个打开文件的对话框,此对话框允许用户打开文件并选择一个允许类型的文件。
参数含义:指向GetOpenFileName 结构体的指针。此结构体包含了初始化弹出对话框的信息。当GetOpenFile函数返回时,这个结构体包含用户的选择信息(lpstrFile存文件名)。如图1。
返回值:用户指定一个文件名并点击了OK按钮之后,此函数返回一个非0值。lpstrFile包含文件的路径和文件名信息。当用户点击了对话框的取消按钮或者关闭对话框或者错误发生,此函数返回0值。
使用GetOpenFileName (&ofn)语句可以创建一个对话框并实现选择文件的功能,ofn为已经初始化的OPENFILENAME结构体。
OPENFILENAME结构体的lpstrFile赋值的数组中存入了载入文件的路径和文件名。如果要将此信息保存下来,则可以用SysAllocString( szBuffer ) 为文件名变量分配一块内存并将此文件名变量的值赋值给此块内存。szBuffer保存了载入文件的路径和信息,赋值于OPENFILENAME 结构体中的lpstrFile元素。
验证以上步骤采用上次D3D框架来实现(D3D框架),具体步骤为:D3D框架程序中的对话框,往此对话框中拉一个按钮,选中按钮,右键,选择属性,将按钮改名为“打开文件”,ID改为IDC_OPENFILE然后双击此按钮(为按钮添加响应函数),在弹出的新函数中编写代码:
void CMFCDialogD3DAppDlg::OnBnClickedOpenfile()
{
// TODO: Add your control notification handler code here
OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(ofn));
TCHAR szBuffer[MAX_PATH];
szBuffer[0] = NULL;
static const TCHAR szFilter[]
= TEXT("Video Files (.ASF, .AVI, .MPG, .MPEG, .VOB, .QT, .WMV)\0*.ASF;*.AVI;*.MPG;*.MPEG;*.VOB;*.QT;*.WMV\0") \
TEXT("All Files (*.*)\0*.*\0\0");
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;//g_hWnd;
ofn.hInstance = NULL;
ofn.lpstrFilter = szFilter;
ofn.nFilterIndex = 1;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.lpstrFile = szBuffer;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = TEXT("Select a video file to play...");
ofn.Flags = OFN_HIDEREADONLY;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = TEXT("AVI");
ofn.lCustData = 0L;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
if (GetOpenFileName (&ofn)) // user specified a file
{
::MessageBox(NULL, _T("Open file successed"),_T("HI"), MB_OK);
}
}
编译程序通过后,点击对话框中“打开文件”按钮即可弹出一个对话框,让用户选择需要载入的文件。
运行结果:
图2 D3D程序运行结果
然后点击打开文件按钮之后的界面
图3 点击打开文件后弹出的窗口
当然,当需要载入一个文件的时候,肯定是要对此文件做响应的操作,肯定是要保存此文件的信息的。^-^,一步一步来了。
此次笔记记录完毕。