分享
 
 
 

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

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

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

作者:井中月_VC

单位: 西京大学

下载源代码

前言:

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

正文:

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

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

3、m_ofn成及OPENFILENAME的介绍:

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

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

6、多选问题的解决:

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

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

图一

思路:

从CFileDialog派生CFileDialogEx类,为对话框安装钩子,利用HOOK拦截我们感兴趣的CDN_SELCHANGE消息,在其中加入我们的预览功能,原理就是这么简单!

使用方法:

1):在ResourView中,加一个对话框,其 ID为IDD_DIALOG_HOOK, 注意其属性的设置:Dialog Properties-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 dlg(TRUE);

if(dlg.DoModal() == IDOK)

{

POSITION Pos;

Pos = dlg.GetStartPosition();

while (Pos != NULL)

{

strPathName = dlg.GetNextPathName(Pos);

if(!strPathName.IsEmpty())

{

MessageBox(strPathName, _T("GetNextPathName"), MB_ICONINFORMATION);

}

}

}

注:由于时间紧,在Debug版本下,双击选中文件后,有暴停的现象(内存泄漏),而且显示效果也没有进行处理! 2、Win2000,XP下预览对话框的实现:比图一多了左面的快捷栏(方便用户查找)。其实这个实现很简单,只要判断一下系统的版本就可以了,但是98下只显示图一所示的对话框,2000,XP则显示图二的对话框,这是MS在98以后的版本,对这个东东重新进行了封装!

详情请看链接: 利用MFC的CFileDialog怎么样生成Win2000的文件对话框,

http://www.chinaaspx.com/archive/VC/1068.htm

图二

只要在CFileDialogEX dlg(TRUE)后面,加上如下代码,就可以显示图2效果。

//--------只要加上下面这段代码,就可以显示2000下的打开文件对话框-------------

//------用来检测目前的操作系统的版本信息

int nStructSize = 0;

DWORD dwVersion, dwWindowsMajorVersion, dwWindwosMinorVersion;

dwVersion = GetVersion();

dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));

dwWindwosMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));

if(dwVersion < 0x80000000)

{

nStructSize = 88; //2k,xp下显示新的版本

}

else

{

nStructSize = 76; //98下显示老版本,如图1

}

dlg.m_ofn.lStructSize = nStructSize; //------用来检测目前的操作系统的版本信息

3、m_ofn成员及OPENFILENAME的介绍:

OPENFILENAME结构体:虽然成员变量不少,但是我们常用的就几个而已!该结构体包含一些保存或打开文件对话框的重要信息,比如过滤文件名,指定初始化路径,对文件进行多选,显示98风格还是2000风格的open/save对话框!

typedef struct tagOFN { // ofn

DWORD 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 lpstrDefExt;

DWORD lCustData;

LPOFNHOOKPROC lpfnHook;

LPCTSTR lpTemplateName;

} OPENFILENAME;

Members

lStructSize :

指定OPENFILENAME结构体的大小(字节)。这个决定你的对话框显示98风格,还是2k风格。

hwndOwner :

指定拥有该对话框的窗口的标识,可以是任何有效窗口的句柄,也可以为空。

hInstance :

当在Flags中已经设置OFN_ENABLETEMPLATEHANMDLE标志,那么hInstance是一个包含对话框模板的内存对象的句柄,假设OFN_ENABLETEMPLATE标志已经设置,那么hInstance标识一个由lpTemplateName命名的对话框模板。

lpstrFilter:

指向一个以一对“\0”结尾的过滤字符串的缓冲区。在缓冲区中的最后一个字符串必定是以两个NULL字符结束。(一般第一个字符串描述要过滤的格式,如“Text

Files”,第二个字符串一般过滤格式进行指定,如“*.TXT”)。

如: _T(".JPG .JPEG\0*.jpg;*.jpeg\0.STL\0*.stl\0所有文件 \0 *.*\0 ");

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个空间易浪费了。下面介绍一个动态解决分配的方法,请看代码:

//------1.动态分配内存空间,解决多选的问题---------------------------------------

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联系!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有