GetOpenFileName打开文件 [大三TJB_708]

通过GetOpenFileName函数可在在VS2010程序中创建一个对话框然后选择一个文件载入到程序中(获取文件信息保存到程序中)。在windows之上运行的程序,这个过程一般是弹出一个对话框,在对话框的下拉菜单中选择需要选择的文件,然后将文件载入程序中。实现此功能主要包含两个部分,第一个部分是OPENFILENAME结构体设置,包括用来设置弹出对话框的属性及保存载入的文件名;第二部分就是调用GetOpenFileName函数来载入文件。简要记录这两个部分的实现

 

1 初始化打开文件对话框

       打开文件对话框就是供用户选择要载入文件的路径的,是人机交互的一个对话框。采用OPENFILENAME结构体来初始化。

 

<1> 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即可。在上表中的元素对应的对话框的项如下图所示

GetOpenFileName打开文件 [大三TJB_708]_第1张图片

 

图1 OPENFILENAME结构体元素对应对话框属性图

 

<2>使用GetOpenFileName函数

函数原型:BOOLWINAPR  GetOpenFileName(_Inout_LPOPENFILENAME lpofn)

函数功能:创建一个打开文件的对话框,此对话框允许用户打开文件并选择一个允许类型的文件。

参数含义:指向GetOpenFileName 结构体的指针。此结构体包含了初始化弹出对话框的信息。当GetOpenFile函数返回时,这个结构体包含用户的选择信息(lpstrFile存文件名)。如图1

返回值:用户指定一个文件名并点击了OK按钮之后,此函数返回一个非0值。lpstrFile包含文件的路径和文件名信息。当用户点击了对话框的取消按钮或者关闭对话框或者错误发生,此函数返回0值。

 

使用GetOpenFileName (&ofn)语句可以创建一个对话框并实现选择文件的功能,ofn为已经初始化的OPENFILENAME结构体。

 

OPENFILENAME结构体的lpstrFile赋值的数组中存入了载入文件的路径和文件名。如果要将此信息保存下来,则可以用SysAllocString( szBuffer ) 为文件名变量分配一块内存并将此文件名变量的值赋值给此块内存。szBuffer保存了载入文件的路径和信息,赋值于OPENFILENAME 结构体中的lpstrFile元素。

 

3 实例

     验证以上步骤采用上次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);
    }
}

编译程序通过后,点击对话框中“打开文件”按钮即可弹出一个对话框,让用户选择需要载入的文件。

运行结果:

GetOpenFileName打开文件 [大三TJB_708]_第2张图片

 

图2 D3D程序运行结果

然后点击打开文件按钮之后的界面

GetOpenFileName打开文件 [大三TJB_708]_第3张图片

 

图3 点击打开文件后弹出的窗口

当然,当需要载入一个文件的时候,肯定是要对此文件做响应的操作,肯定是要保存此文件的信息的。^-^,一步一步来了。

 

此次笔记记录完毕。

你可能感兴趣的:(碚大)