GetOpenFileName打开文件 [大三TJB_708]_getopenfilename 初始化_资质平庸的程序员的博客-程序员秘密

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

 

图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);
    }
}

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

运行结果:

 

图2 D3D程序运行结果

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

 

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

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

 

此次笔记记录完毕。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/misskissC/article/details/8927650

智能推荐

PageX、clientX、screenX、offsetX、layerX的区别_·Q·的博客-程序员秘密

一.PageX和clientXPageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化clientX:鼠标在页面上可视区域的位置,从浏览器可视区域左上角开始,即是以浏览器滑动条此刻的滑动到的位置为参考点,随滑动条移而变化.二.screenXscreenX:鼠标在屏幕上的位置,从屏幕左上角开始,这个没有任何争议三.offsetX和layerXoffsetX:IE特有,鼠标相比较于触发事件的元素的位置,以元素盒子模型的内容区域的左上角为参考点,如果有bode

ESXI删除状态为“无效”的虚拟机_esxi注册虚拟机后状态显示无效_酒癫儿的博客-程序员秘密

方法/步骤删除ESXI系统内标识为无效的虚拟机:SSH登录ESXI服务器,在在 /etc/vmware/hostd目录下输入vim-cmd vmsvc/getallvms列表中显示Skipping invalid VM '1' , Skipping为已失效的虚拟机,编号1为该虚拟机的编号。使用putty工具ssh登录上去,使用以下命令取消注册虚拟机vim-cmd vmsvc/unr...

rk3399 rv1126上使用wk2124_rk3399 wk2124_xian0gang的博客-程序员秘密

wk2124是一个通过spi扩充为4路串口的模块,在嵌入式设备上能充分利用资源,我在rk3399和rv1126上移植了wk2124,比较容易,我想它在其他linux平台使用起来也是可以的。设备树添加&amp;spi0 { status = "okay"; max-freq = &lt;48000000&gt;; /* spi internal clk, don't modify */ spi[email protected] { compatible = "wkmic,wk2124spi"; reg = &

bzoj 1036--树的统计Count 树链剖分+线段树_ITKaven的博客-程序员秘密

前段时间学习过树链剖分,这个题正好试试水,还是比较简单的吧,自己一个人不看博客还是给A了。 本人比较懒,题解就看http://hzwer.com/2543.html这个博客吧,讲的很好,orz。这种题一般都是按这种套路来吧。#include&amp;amp;amp;lt;cstdio&amp;amp;amp;gt;#include&amp;amp;amp;lt;vector&amp;amp;amp;gt;#include&amp;amp;amp;lt;algorithm&amp;amp;amp;g

住宅电梯仍是主流市场_设计交流学习的博客-程序员秘密

远程维修监控中心始终监控着他们所承包的电梯,随时可以知道电梯的运行状态和发生故障的属性,维修人员去故障梯之前就已知道该维修的项目,减少了维修服务的成本和时间,这种预保养式的售后服务方式在国外是深得用户的信赖的,这也将是我国电梯工业技术发展的一个重要方向。利用电梯机房在楼顶的优势,充分利用太阳能作为电梯的补充能源也将是新的研究课题。摩天大楼的高度限制,不仅是建筑技术上的问题,一个重要的因素是受到电梯提升高度的限制,因而电梯不仅是代步的工具,也是人类文明的标志,其技术的发展正体现了社会的进步与文明。

过滤aviator正则表达式规则aviator自定义正则表达式_君子志邦的博客-程序员秘密

1、自定义的表达式配置案例 patternfunction('李克强:抢到桥店强调我们要做好今天','title') 2、自定义AviatorObject实现的依赖配置 &lt;!-- https://mvnrepository.com/artifact/com.googlecode.aviator/aviator --&gt;&lt;dependency&gt; &lt;groupId&gt;com.googlecode.aviator&lt;/groupId&gt; ..

随便推点

Kinect开发学习笔记之(四)提取颜色数据并用OpenCV显示_颜色标度图提取数据_zouxy09的博客-程序员秘密

Kinect开发学习笔记之(四)提取颜色数据并用OpenCV显示[email protected]://blog.csdn.net/zouxy09 我的Kinect开发平台是:Win7 x86 + VS2010 + Kinect for Windows SDK v1.6 + OpenCV2.3.0开发环境的搭建见上一文: http://blog.csdn.net/zo

将kubernetes跑在本地LXD容器中(by quqi99)_quqi99的博客-程序员秘密

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (http://blog.csdn.net/quqi99)问题本文将kubernetest跑在本地LXD容器中。Kubernetes是什么Kubernetes是什么,见我的博客。安装LXD如何安装LXD,见我的博客。 这篇文章和之前的在LXD上运行容器化的OpenStack类似,见我的博客。LXD上安装Kube

双端队列BFS_迷亭1213的博客-程序员秘密

问题模型1-1: 如果在一张图上(有向图和无向图),边权只可能是1或0,现在我们想从某个节点(假设为s)到另一个节点(假设为t),怎样才能使得路径上的权值和最大?这是最短路径问题中的特例,因为其边权只可能是0或1;同时这也是许多问题的抽象形式,很多问题可以抽象为上述模型1-1。我们的目标就是找到一个尽可能高效的算法解决上述问题模型。最短路径算法这是很容易想到的图论算法,解决此题的效率为O...

用 pbuilder-dist 进行打包失败, 升级 approx 到 4.5 解决_weixin_30596165的博客-程序员秘密

环境: Ubuntu 10.10, amd64其他环境可以参考在 Ubuntu 下构建 Debian 打包环境问题用 pbuilder-sid 打包 gmchess 时失败,报告libudev0,x11-common 下载失败原因libudev0 已经发布了 166-1 版本,但 pbuilder-sid 试图下载 165-1 版本,下载失败...

字符集 ISO-8859-1(2)_weixin_34209406的博客-程序员秘密

HTML 支持的数学符号结果描述实体名称实体编号∀for all&amp;amp;forall;&amp;amp;#8704;∂part&amp;amp;part;&amp;amp;#8706;∃exists&amp;amp;exists;&amp;amp;#8707;∅empty&amp;amp;empty;&amp;amp;#8709;∇nabla&amp;amp;nabla;&amp;amp;#8711;...

Linux设置node的process.env.NODE_ENV_CyborgLin的博客-程序员秘密

Linux环境下设置node的process.env.NODE_ENV命令:export NODE_ENV=development设置完成,查看命令:env | grep NODE_ENV

推荐文章

热门文章

相关标签