热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

在打开文件对话框上实现图象预览

前言:本文主要是介绍在打开文件对话框,实现对图象,文本等预览(在VC++6.0下实现)。本人的水平有限,如有表达不清之处,请谅解,请各位提出意见与建议!正文:1、Win98下预览对话框

前言:

本文主要是介绍在打开文件对话框,实现对图象,文本等预览(在VC++6.0下实现)。本人的水平有限,如有表达不清之处,请谅解,请各位提出意见与建议!

正文:

1、Win98下预览对话框的实现:

2、Win2000,XP下预览对话框的实现:

3、m_ofn成及OPENFILENAME的介绍:

4、定制个性的CFileDialog对话框:

5、怎么样把预览区,放在对话框的右边:

6、多选问题的解决:

7、对预览问题的收集,如对文本,声音等:


1、Win98下预览对话框的实现

对常用格式的图片,在打开文件对话框中实现预览功能效果如下图:

lpstrFile :

指向一个包含文件名的缓冲区,用来初始化文件名编辑框。初始化不是必须的,也可以为空。Notice:如果OFN_ALLOWNULTISELECT标志已设定,用户对文件进行多选,那么该缓冲区包含所有被选择的文件名,如果缓冲区太小,这个函数返回FALSE。

nMaxFile:

这个缓冲区的大小由lpstrFile指定。

lpstrFileTitle:

指向一个接收已选择文件文件名和扩展名(不包括路径信息)的缓冲区,也可以为空。

lpstrInitialDir :

指向一个指定初始化路径的字符串,也就是最初弹出时所显示的目录。如果为NULL,则当前目录为初始目录。

lpstrTitle :

用来设置对话框的标题,如果为空,系统会用默认的标题(“打开” 或 “保存”)。

Flags :

可以设置一些标志或标志的组合来初始化对话框的显示外观。

Flag Meaning

OFN_ALLOWMULTISELECT:这个标志是允许选择多个文件,如果你想选择N个文件,那么这个标志一定要设置。

OFN_ENABLEHOOK:允许lpfnHook为对话框指定一个HOOK函数,用来处理对话框的消息。也就可以拦截我们感兴趣的消息。如:CDN_SELCHANGE

OFN_ENABLESIZING: 这个标志设定后,在对话框右下角会出现一个东东,允许用户随意扩大和缩小对话框

OFN_ENABLETEMPLATE:这个很重要,如果你想加入一个对话框模板做为预览区, 这个标志一定要设置。

OFN_EXPLORER:这个标志是最重要的,如果你想定制对话框模板,利用HOOK函数,对文件进行多选,这个标志必须设定。

OFN_HIDEREADONLY:隐藏只读属性复选框。

OFN_READONLY:设定这标志,会在对话框的下方出现一个“Read Only”的复选框。

OFN_SHOWHELP:设置该标志,在对话框上会显示 “帮助”按钮。

lpstrDefExt :

指向一个包含默认扩展名的缓冲区。

lpfnHook:

指向一个HOOK的处理过程函数。在该函数里实现拦截我们想要的消息。

lpTemplateName :

指向一个以对话框模板资源命名的字符串(以NULL结尾),该对话框模板在模块中由hInstance成员标识。注意:如果想指定一个对话框模板资源必须在Flags中设定OFN_ENABLETEMPLATE。

如: m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG_HOOK)。


4、定制个性的CFileDialog对话框

这个对Win98下的对话框用处比较大(个人观点),我在这里不详细的说明只是给大家一个链接:http://www.codesky.net/article/list.asp?id=3920


5. 怎么样把预览区,放在对话框的右边

有时候,我们想把预览区放在右边,而且还想在最下面添加一些控件(如下图三),该怎么办呢?当时,我找了半天资料也没找到,后来我们老大告诉我应该这样…..


图三

其实很简单,只要加一个StaticText控件就可以了,注意其ID设置,我设为stc32。但是其摆放位置很重要。如果你想要实现图三的效果,必须如图四这样放置:


图四

如果你想实现这样的放置效果,并且复选框一定要在预览区的下面,如图五:


图五

则Static text要如图六这样放置:


图六

关于预览区的放置,MSDN上有说明,但是我找不到(找了一个下午)!


6、多选问题的解决

1).使用CFileDialog类选择多个文件时,发现选择的文件个数有限,这是因为m_ofn.nMaxFile的值有限:256Btye,解决的办法是:将m_ofn.lpstrFile的缓冲区换成自己的指针。选择多个文件,首先要给m_ofn的标志nFlags加上OFN_ALLOWMULTISELECT。当用户选择多个文件,CFileDialog会把选择后的文件名拷贝到一个缓冲区,默认这个缓冲区有256个字符,这对于要求多选的用户来说是不够的。你可以将m_ofn.lpstrFile替换成自己的缓冲区指针:

char sBuffer[2000]; 
memset(sBuffer, 0, 2000);
CSTLFileDialog dlg(TRUE);
dlg.m_ofn.lpstrFile = sBuffer;
dlg.m_ofn.nMaxFile = 2000; //解决多选问题

这个方法解决多选问题,就是简便易懂。如果你多选的真好是257或300个字符,那么其余的1400个空间易浪费了。下面介绍一个动态解决分配的方法,请看代码:

void CSTLFileDialog::SolveMoreSelect()
{
TCHAR chBuffer;
TCHAR *chFiles = NULL;
TCHAR *chFolder = NULL;
UINT nFileSize;
UINT nFolderSize;

nFileSize = CommDlg_OpenSave_GetSpec(GetParent()->m_hWnd, &chBuffer,
1);
nFolderSize = CommDlg_OpenSave_GetFolderPath(GetParent()->m_hWnd, &chBuffer,
1);

if((nFileSize + nFolderSize) > m_ofn.nMaxFile)
{
if(chFiles)
{
delete[] chFiles;
}

chFiles = new TCHAR[nFileSize + 1];
CommDlg_OpenSave_GetSpec(GetParent()->m_hWnd, chFiles, nFileSize);
if(chFolder)
{
delete[] chFolder;
}

chFolder = new TCHAR[nFolderSize + 1];
CommDlg_OpenSave_GetSpec(GetParent()->m_hWnd, chFolder, nFolderSize);
}
else
{
if(chFiles)
{
delete[] chFiles;
chFiles = NULL;
}

if(chFolder)
{
delete[] chFolder;
chFolder = NULL;
}
}


7、对预览问题的收集,如对文本,声音等

如果您看我的代码比较困难,请到以下链接处:

1)、对文本文件实现预览:http://www.vckbase.com/document/viewdoc/?id=417

2)、对图象文件(2D)实现预览:http://www.codeproject.com/dialog/imagepreviewdialog.asp

3)、对位图文件实现预览:http://www.vccode.com/file_show.php?id=891

4)、对声音文件实现预听:http://www.vccode.com/file_show.php?id=895

结束语:

在这里我要感谢帮助过我的朋友们,希望您对我写的文章提出宝贵的意见!另外如果有时间我的另一篇文章将介绍在CFileDialog的打开文件对话框中,实现对3D图形的预览,也就是对STL(CAD中常用的存储格式)格式的文件进行预览,这才是我的要做的!如果表述不清之处,请Email联系!


推荐阅读
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 本文介绍了一种利用Dom4j库和JFileChooser组件在Java中实现XML文件自定义路径导出的方法。通过创建一个Document对象并设置根元素,结合JFileChooser选择目标路径,实现了灵活的XML文件导出功能。具体步骤包括初始化Document对象、构建XML结构以及使用JFileChooser选择保存路径,确保用户能够方便地将生成的XML文件保存到指定位置。 ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • 本文介绍了如何使用Adobe Photoshop将图片调整为800x800像素,并确保图片清晰度不受影响,特别适合用于制作淘宝主图。无论是原始图片大于或小于800x800像素,都能通过以下步骤轻松完成。 ... [详细]
  • 无论是在迁移到云服务还是更换云服务商的过程中,数据迁移都是一个至关重要的环节。本文将探讨数据迁移中可能遇到的问题及解决方案,包括路径问题、速度问题和数据完整性等。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文详细介绍了如何使用JavaScript实现面部交换功能,包括基本原理和具体实现步骤。 ... [详细]
  • 本文详细介绍了 Oracle 数据库的自动备份机制及其安装步骤。通过具体示例,解释了系统变更号(SCN)和块结构在备份过程中的作用,以及热备份恢复的具体步骤。 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
author-avatar
mobiledu2502894873
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有