2022年VC编程中在打开资料对话框上实现图象预览.docx
VC编程中在打开文件对话框上实现图象预览 图安全中国 更新时间 :2021-06-12 03:01:40责任编辑 : 池天热 点:前言:本文主要是介绍在打开文件对话框,实现对图象,文本等预览 在 VC+6.0 下实现 ;本人的水平有限,如有表达不清之处,请谅解,请各位提出看法与建议!正文:1、Win98 下预览对话框的实现:2、Win2000,XP 下预览对话框的实现:3、m_ofn 成及 OPENFILENAM的E 介绍: 4、定制个性的 CFileDialog 对话框: 5、怎么样把预览区,放在对话框的右边:6、多项问题的解决:7、对预览问题的收集,如对文本,声音等:26 / 261、Win98 下预览对话框的实现:对常用格式的图片,在打开文件对话框中实现预览功能成效如下图:图一思路:从 CFileDialog派生 CFileDialogEx类,为对话框安装钩子,利用HOOK拦截我们感爱好的CDN_SELCHANG消E息,在其中加入我们的预览功能,原理就是这么简洁!使用方法:1):在 ResourView 中,加一个对话框, 其 ID 为 IDD_DIALOG_HOOK,留意其属性的设置: DialogProperties->styles下=> style为Child 、Border 为 None, 选中 Clip siblings; More Styles下 =>选中 3D-look 、 Contol;2) :在对话框上加一个Static Text控件,用来显示图片;ID 为 IDC_PIC,其属性的设置为: Text Properties下 =>选中 Notify、Sunken;3) :将 Picture.h,Picture.cpp;CFileDialogEx.h,CFileDialogEx.cpp添加到工程中;其中类CFileProcess是文件处理类,用于文件进行操作;类CPicture用于处理图片;(详见代码)4) 在应用处,只要包含头文件#include ”FileDialogEx.h”;For example:CString strPathName;CFileDialogEx dlgTRUE;ifdlg.DoModal = IDOKPOSITION Pos;Pos = dlg.GetStartPosition;while Pos .= NULLstrPathName = dlg.GetNextPathNamePos;if.strPathName.IsEmptyMessageBoxstrPathName, _T"GetNextPathName", MB_ICONINFORMATION;注:由于时间紧,在Debug 版本下,双击选中文件后,有暴停的现象(内存泄漏), 而且显示成效也没有进行处理!2、Win2000,XP 下预览对话框的实现:比图一多了左面的快捷栏(便利用户查找);其实这个实现很简洁,只要判定一下系统的版本就可以了,但是 98 下只显示图一所示的对话框,2000 ,XP就显示图二的对话框,这是MS在 98 以后的版本,对这个东东重新进行了封装!详情请看链接 :利用 MFC的 CFileDialog怎么样生成 Win2000 的文件对话框 , 图二只要在 CFileDialogEX dlgTRUE后面,加上如下代码,就可以显示图2 成效;/-只要加上下面这段代码,就可以显示2000 下的打开文件对话框 -/-用来检测目前的操作系统的版本信息int nStructSize = 0;DWORD dwVersion, dwWindowsMajorVersion, dwWindwosMinorVersion;dwVersion = GetVersion;dwWindowsMajorVersion = DWORDLOBYTELOWORDdwVersion;dwWindwosMinorVersion = DWORDHIBYTELOWORDdwVersion;ifdwVersion < 0x80000000nStructSize = 88;/2k,xp下显示新的版本elsenStructSize = 76;/98下显示老版本,如图 1dlg.m_ofn.lStructSize = nStructSize; /-用来检测目前的操作系统的版本信息3、m_ofn 成员及 OPENFILENAM的E 介绍:OPENFILENAM结E 构体:虽然成员变量不少,但是我们常用的就几个而已!该结构体包含一些储存或打开文件对话框的重要信息,比如过滤文件名,指定初始化路径,对文件进行多项, 显示 98 风格仍是 2000 风格的 open/save 对话框!typedef struct tagOFN / ofnDWORD lStructSize;HWND hwndOwner;HINSTANCE hInstance;LPCTSTR lpstrFilter;LPTSTR lpstrCustomFilter;DWORD nMaxCustFilter;DWORD nFilterIndex;LPTSTR lpstrFile;DWORD nMaxFile;LPTSTR lpstrFileTitle;DWORD nMaxFileTitle;LPCTSTR lpstrInitialDir;LPCTSTR lpstrTitle;DWORD Flags;WORD nFileOffset;WORD nFileExtension;LPCTSTR lpstrDefExtDWORD lCustData;LPOFNHOOKPROC lpfnHook ;LPCTSTR lpTemplateName; OPENFILENAME;MemberslStructSize:指定 OPENFILENAM结E 构体的大小(字节);这个打算你的对话框显示98 风格,仍是 2k 风格; hwndOwner :指定拥有该对话框的窗口的标识, 可以是任何有效窗口的句柄, 也可以为空; hInstance:当在 Flags 中已经设置 OFN_ENABLETEMPLATEHANMDLE标志 , 那么 hInstance是一个包含对话框模板的内存对象的句柄,假设 OFN_ENABLETEMPLA标TE志已经设置, 那么 hInstance标识一个由 lpTemplateName 命名的对话框模板; lpstrFilter:指向一个以一对“0”结尾的过滤字符串的缓冲区;在缓冲区中的最终一个字符串必定是以两个NULL字符终止; 一般第一个字符串描述要过滤的格式,如“ TextFiles ”, 其次个字符串一般过滤格式进行指定, 如“ *.TXT ” ;如: _T".JPG .JPEG0*.jpg;*.jpeg0.STL0*.stl0全部文件 0 *.*0 "; lpstrFile:指向一个包含文件名的缓冲区,用来初始化文件名编辑框;初始化不是必需的,也可以为空;Notice:假如 OFN_ALLOWNULTISELE标CT志已设定,用户对文件进行多项,那么该缓冲区包含全部被挑选的文件名,假如缓冲区太小,这个函数返回FALSE; nMaxFile :这个缓冲区的大小由 lpstrFile指定; lpstrFileTitle:指向一个接收已挑选文件文件名和扩展名(不包括路径信息)的缓冲区,也可以为空;lpstrInitialDir:指向一个指定初始化路径的字符串,也就是最初弹出时所显示的目录;假如为NULL,就当前目录为初始目录;lpstrTitle:用来设置对话框的标题,假如为空,系统会用默认的标题(“打开”或“储存”); Flags:可以设置一些标志或 标志的组合来初始化对话框的显示外观;Flag MeaningOFN_ALLOWMULTISELE:C这T 个标志是答应挑选多个文件,假如你想挑选N个文件,那么这个标志肯定要设置;OFN_ENABLEHO:OK答应 lpfnHook为对话框指定一个HOOK函数,用来处理对话框的消息;也就可以拦截我们感爱好的消息;如:CDN_SELCHANGEOFN_ENABLESI:ZIN这G 个标志设定后,在对话框右下角会显现一个东东,答应用户随便扩大和缩小对话框 OFN_ENABLETEMPLA:T这E个很重要, 假如你想加入一个对话框模板做为预览区,这个标志肯定要设置; OFN_EXPLORE:R这个标志是最重要的,假如你想定制对话框模板,利用HOOK函数,对文件进行多项,这个标志必需设定;OFN_HIDEREADON:LY隐匿只读属性复选框;OFN_READON:LY设定这标志,会在对话框的下方显现一个“Read Only”的复选框;OFN_SHOWHE:LP设置该标志,在对话框上会显示“帮忙”按钮;lpstrDefExt:指向一个包含默认扩展名的缓冲区;lpfnHook :指向一个 HOOK的处理过程函数;在该函数里实现拦截我们想要的消息; lpTemplateName:指向一个以对话框模板资源命名的字符串(以NULL结尾) , 该对话框模板在模块中由hInstance成员标识;留意:假如想指定一个对话框模板资源必需在Flags 中设定 OFN_ENABLETEMPLA;TE如: m_ofn.lpTemplateName = MAKEINTRESOURCEIDD_DIALOG_HOOK;4、定制个性的CFileDialog对话框:这个对 Win98 下的对话框用处比较大 个人观点 ,我在这里不具体的说明只是给大家一个链接:5.怎么样把预览区,放在对话框的右边:有时候,我们想把预览区放在右边,而且仍想在最下面添加一些控件(如下图三),该怎么办呢?当时,我找了半天资料也没找到,后来我们老大告知我应当这样.图三其实很简洁,只要加一个StaticText控件就可以了,留意其ID 设置,我设为stc32 ;但是其摆放位置很重要;假如你想要实现图三的成效,必需如图四这样放置:图四假如你想实现这样的放置成效,并且复选框肯定要在预览区的下面,如图五:图五就 Static text要如图六这样放置 :图六关于预览区的放置, MSDN上有说明,但是我找不到(找了一个下午)!6、多项问题的解决:1). 使用 CFileDialog类挑选多个文件时,发觉挑选的文件个数有限,这是由于m_ofn.nMaxFile的值有限: 256Btye ,解决的方法是: 将 m_ofn.lpstrFile的缓冲区换成自己的指针;挑选多个文件,第一要给m_ofn 的标志 nFlags 加上 OFN_ALLOWMULTISELE;C当T 用户挑选多个文件, CFileDialog会把挑选后的文件名拷贝到一个缓冲区,默认这个缓冲区有256 个字符,这对于要求多项的用户来说是不够的;你可以将m_ofn.lpstrFile替换成自己的缓冲区指针:char sBuffer2000;memsetsBuffer, 0, 2000;CSTLFileDialog dlgTRUE;dlg.m_ofn.lpstrFile = sBufferdlg.m_ofn.nMaxFile = 2000; /;解决多项问题这个方法解决多项问题,就是简便易懂;假如你多项的真好是257 或 300 个字符,那么其余的1400 个空间易铺张了;下面介绍一个动态解决安排的方法,请看代码:/-1.动态安排内存空间,解决多项的问题-void CSTLFileDialog:SolveMoreSelectTCHAR chBuffer;TCHAR *chFiles = NULL;TCHAR *chFolder = NULL;UINT nFileSize;UINT nFolderSize;nFileSize = CommDlg_OpenSave_GetSpecGetParent->m_hWnd, &chBuffer,1) ;nFolderSize = CommDlg_OpenSave_GetFolderPathGetParent->m_hWnd, &chBuffer,1;ifnFileSize + nFolderSize > m_ofn.nMaxFileifchFilesdelete chFiles;chFiles = new TCHARnFileSize + 1;CommDlg_OpenSave_GetSpecGetParent->m_hWnd, chFiles, nFileSize;ifchFolderdelete chFolder;chFolder = new TCHARnFolderSize + 1;CommDlg_OpenSave_GetSpecGetParent->m_hWnd, chFolder, nFolderSize;elseifchFilesdelete chFiles;chFiles = NULL;ifchFolderdelete chFolder;chFolder = NULL;7、对预览问题的收集,如对文本,声音等: 假如您看我的代码比较困难,请到以下链接处:1)、对文本文件实现预览: 2)、对图象文件(2D)实现预览: 3)、对位图文件实现预览: 4)、对声音文件实现预听:终止语:在这里我要感谢帮忙过我的伴侣们,期望您对我写的文章提出珍贵的看法!另外假如有时间我的另一篇文章将介绍在CFileDialog的打开文件对话框中,实现对3D 图形的预览,也就是对STL( CAD中常用的储备格式)格式的文件进行预览,这才是我的要做的. 假如表述不清之处,请Email 联系!