非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系统的风格,又在细微之处有自己的修改。若要实现较大改动,如在对话框中增加图片预览等,就需要用到响应的模板了,这里不做介绍。
本文链接地址:http://www.ioxiu.com/2010/10/2224.html
订阅袖子的博客:http://www.ioxiu.com/feed
- 非MFC,利用window api OPENFILENAME实现定制打开文件对话框
- 非MFC,利用window api OPENFILENAME实现文件夹选择
- openfilename打开文件对话框的使用
- OPENFILENAME打开文件对话框选择多个文件的问题解决
- VC文件操作:打开文件对话框 OPENFILENAME 代码
- OPENFILENAME打开文件对话框选择多个文件的问题解决
- 定制打开文件对话框
- Access利用Windows API打开文件对话框
- MFC 文件打开对话框(CFileDialog类或OPENFILENAME结构体)后,保持程序的路径不变
- 打开文件对话框和文件夹对话框之MFC和API实现。
- 使用 OPENFILENAME 以及 GetOpenFileName、GetSaveFileName 实现打开,保存对话框
- MFC打开文件对话框功能实现
- MFC 实现打开文件对话框 保存文件对话框
- 自己定制打开文件对话框
- MFC打开文件对话框
- MFC 文件打开对话框
- MFC对话框打开文件
- MFC打开文件对话框
- OPENFILENAME打开文件对话框选择多个文件的问题解决
- 【Autohotkey】删除资源管理器当前目录
- Android/OPhone自定义视图
- C++函数声明和定义的原因和作用
- gwt框架搭建相关
- 非MFC,利用window api OPENFILENAME实现定制打开文件对话框
- ARM的异常处理
- Android的第一个应用
- 表空间查询和扩展
- 会話用語
- 微笑面对
- Flex之数据格式化
- Form Authentication for MOSS 2007 Site
- Linux Perforce(P4)客户端使用