非MFC,利用window api OPENFILENAME实现定制打开文件对话框

来源:互联网 发布:淘宝dnf异次元碎片cdk 编辑:程序博客网 时间:2024/05/02 04:18

最近一直在做window shell开发,全部界面的实现都要求用window api而不用我熟悉的MFC开发。而要求实现的功能却是一样的。同样的东西,MFC可能用个系统自带的类就实现了,可是用window api的话就费老鼻子劲了,而且网上相关信息N少N少,上CSDN去提问基本上回答的人也是四六不靠的。于是想记录下一些相关的开发经验,即算自己的一个总结也算给其他开发相关内容的人留点参考资料。

这里讲一下如何不用MFC只用window api实现定制打开文件对话框(custom open file dialog)。打开或者保存文件对话框MFC下有CFileDialog属于“通用对话框(common dialog)”的子类,CFileDialog类中包含一个OPENFILENAME结构体,在window api的实现中,只要利用这个结构体就能实现打开文件对话框的及定制功能。例子的开发环境是visual studio2008。

一、OPENFILENAME基础

OPENFILENAME的结构初始化如下:

通过调用GetOpenFileName(&ofn)或者GetSaveFileName(&ofn)来生成打开文件对话框或者保存文件对话框。对话框调用异常则函数返回值为0。

二、如何实现定制对话框

要实现定制对话框必须实现钩子函数,在钩子函数中实现对各种消息的响应。需要对OPENFILENAME结构做两点修改:1,ofn.Flags增加OFN_ENABLEHOOK值;2,ofn.lpfnHook赋值钩子函数的函数名,见第11行代码。
钩子函数OFNHookProc的函数体如下:

在钩子函数中响应生成打开对话框的各种消息。例子中响应了WM_INITDIALOG消息,在这个消息的处理中,我们可以通过一些windows提供的函数例如SetDlgItemText修改按钮文字,SetWindowPos修改控件显示位置、ShowWindow隐藏某些控件等。例子中SetDlgItemText(hhwnd,1, _T(“hello >>”));是将控件ID为1的“打开”或者“保存”按钮的文字修改为“hello >>”。具体哪些控件的ID是多少可以用Visual studio提供的spy++工具来查看。系统也为一些空间提供了默认值,例如0x442是文件名的Static控件。

以上这些基本操作可以实现简单的打开文件对话框的定制,即有windows系统的风格,又在细微之处有自己的修改。若要实现较大改动,如在对话框中增加图片预览等,就需要用到响应的模板了,这里不做介绍。

原创文章,转载请注明: 转载自袖子的博客 >> 非MFC,利用window api OPENFILENAME实现定制打开文件对话框
本文链接地址:http://www.ioxiu.com/2010/10/2224.html
订阅袖子的博客:http://www.ioxiu.com/feed
原创粉丝点击