在打開(kāi)文件對(duì)話框上實(shí)現(xiàn)圖象預(yù)覽
作者:井中月_VC
使用方法:
1):在ResourView中,加一個(gè)對(duì)話框,其 ID為IDD_DIALOG_HOOK, 注意其屬性的設(shè)置:Dialog Properties->styles下=> style為Child、Border為None, 選中Clip siblings。 More Styles下 => 選中3D-look、 Contol。
2):在對(duì)話框上加一個(gè) Static Text控件,用來(lái)顯示圖片。ID為IDC_PIC,其屬性的設(shè)置為:Text Properties下 => 選中Notify、Sunken。
3):將Picture.h,Picture.cpp;CFileDialogEx.h,CFileDialogEx.cpp添加到工程中。其中類CFileProcess是文件處理類,用于文件進(jìn)行操作。類CPicture用于處理圖片。(詳見(jiàn)代碼)
4)在應(yīng)用處,只要包含頭文件 #include”FileDialogEx.h”。
For example:注:由于時(shí)間緊,在Debug版本下,雙擊選中文件后,有暴停的現(xiàn)象(內(nèi)存泄漏),而且顯示效果也沒(méi)有進(jìn)行處理!
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);
}
}
}
2、Win2000,XP下預(yù)覽對(duì)話框的實(shí)現(xiàn):比圖一多了左面的快捷欄(方便用戶查找)。其實(shí)這個(gè)實(shí)現(xiàn)很簡(jiǎn)單,只要判斷一下系統(tǒng)的版本就可以了,但是98下只顯示圖一所示的對(duì)話框,2000,XP則顯示圖二的對(duì)話框,這是MS在98以后的版本,對(duì)這個(gè)東東重新進(jìn)行了封裝!
詳情請(qǐng)看鏈接: 利用MFC的CFileDialog怎么樣生成Win2000的文件對(duì)話框,
http://www.chinaaspx.com/archive/VC/1068.htm
//--------只要加上下面這段代碼,就可以顯示2000下的打開(kāi)文件對(duì)話框-------------
//------用來(lái)檢測(cè)目前的操作系統(tǒng)的版本信息
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; //------用來(lái)檢測(cè)目前的操作系統(tǒng)的版本信息
3、m_ofn成員及OPENFILENAME的介紹:
OPENFILENAME結(jié)構(gòu)體:雖然成員變量不少,但是我們常用的就幾個(gè)而已!該結(jié)構(gòu)體包含一些保存或打開(kāi)文件對(duì)話框的重要信息,比如過(guò)濾文件名,指定初始化路徑,對(duì)文件進(jìn)行多選,顯示98風(fēng)格還是2000風(fēng)格的open/save對(duì)話框!
typedef struct tagOFN { // ofnlStructSize :
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
lpstrDefExt :
指向一個(gè)包含默認(rèn)擴(kuò)展名的緩沖區(qū)。
lpfnHook:
指向一個(gè)HOOK的處理過(guò)程函數(shù)。在該函數(shù)里實(shí)現(xiàn)攔截我們想要的消息。
lpTemplateName :
指向一個(gè)以對(duì)話框模板資源命名的字符串(以NULL結(jié)尾),該對(duì)話框模板在模塊中由hInstance成員標(biāo)識(shí)。注意:如果想指定一個(gè)對(duì)話框模板資源必須在Flags中設(shè)定OFN_ENABLETEMPLATE。
如: m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG_HOOK)。
4、定制個(gè)性的CFileDialog對(duì)話框:
這個(gè)對(duì)Win98下的對(duì)話框用處比較大(個(gè)人觀點(diǎn)),我在這里不詳細(xì)的說(shuō)明只是給大家一個(gè)鏈接:http://www.codesky.net/article/list.asp?id=3920
5. 怎么樣把預(yù)覽區(qū),放在對(duì)話框的右邊: 有時(shí)候,我們想把預(yù)覽區(qū)放在右邊,而且還想在最下面添加一些控件(如下圖三),該怎么辦呢?當(dāng)時(shí),我找了半天資料也沒(méi)找到,后來(lái)我們老大告訴我應(yīng)該這樣…..
6、多選問(wèn)題的解決:
1).使用CFileDialog類選擇多個(gè)文件時(shí),發(fā)現(xiàn)選擇的文件個(gè)數(shù)有限,這是因?yàn)閙_ofn.nMaxFile的值有限:256Btye,解決的辦法是:將m_ofn.lpstrFile的緩沖區(qū)換成自己的指針。選擇多個(gè)文件,首先要給m_ofn的標(biāo)志nFlags加上OFN_ALLOWMULTISELECT。當(dāng)用戶選擇多個(gè)文件,CFileDialog會(huì)把選擇后的文件名拷貝到一個(gè)緩沖區(qū),默認(rèn)這個(gè)緩沖區(qū)有256個(gè)字符,這對(duì)于要求多選的用戶來(lái)說(shuō)是不夠的。你可以將m_ofn.lpstrFile替換成自己的緩沖區(qū)指針:
char sBuffer[2000];
memset(sBuffer, 0, 2000);
CSTLFileDialog dlg(TRUE);
dlg.m_ofn.lpstrFile = sBuffer;
dlg.m_ofn.nMaxFile = 2000; //解決多選問(wèn)題
這個(gè)方法解決多選問(wèn)題,就是簡(jiǎn)便易懂。如果你多選的真好是257或300個(gè)字符,那么其余的1400個(gè)空間易浪費(fèi)了。下面介紹一個(gè)動(dòng)態(tài)解決分配的方法,請(qǐng)看代碼:
//------1.動(dòng)態(tài)分配內(nèi)存空間,解決多選的問(wèn)題---------------------------------------
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、對(duì)預(yù)覽問(wèn)題的收集,如對(duì)文本,聲音等:
如果您看我的代碼比較困難,請(qǐng)到以下鏈接處:
1)、對(duì)文本文件實(shí)現(xiàn)預(yù)覽:http://www.vckbase.com/document/viewdoc/?id=417
2)、對(duì)圖象文件(2D)實(shí)現(xiàn)預(yù)覽:http://www.codeproject.com/dialog/imagepreviewdialog.asp
3)、對(duì)位圖文件實(shí)現(xiàn)預(yù)覽:http://www.vccode.com/file_show.php?id=891
4)、對(duì)聲音文件實(shí)現(xiàn)預(yù)聽(tīng):http://www.vccode.com/file_show.php?id=895
聯(lián)系客服