win2000下“打開(kāi)”對(duì)話框完成2000的風(fēng)格綜述
發(fā)表時(shí)間:2024-05-26 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本人天大小碩,平時(shí)使用VC MFC處理圖像。我生成可執(zhí)行程序的目的不求界面多么pp,只是覺(jué)得很簡(jiǎn)單的windows界面應(yīng)該可以讓人隨心所欲地為己所用,于是乎網(wǎng)上求知,現(xiàn)總結(jié)一下已經(jīng)得到有關(guān)打開(kāi)文件對(duì)話框的實(shí)現(xiàn)方法,希望可以給初學(xué)者添點(diǎn)樂(lè)趣。一般而言,在使用VC新建一個(gè)工程時(shí)可以選擇所要打開(kāi)文件的后...
本人天大小碩,平時(shí)使用VC MFC處理圖像。我生成可執(zhí)行程序的目的不求界面多么pp,只是覺(jué)得很簡(jiǎn)單的windows界面應(yīng)該可以讓人隨心所欲地為己所用,于是乎網(wǎng)上求知,現(xiàn)總結(jié)一下已經(jīng)得到有關(guān)打開(kāi)文件對(duì)話框的實(shí)現(xiàn)方法,希望可以給初學(xué)者添點(diǎn)樂(lè)趣。
一般而言,在使用VC新建一個(gè)工程時(shí)可以選擇所要打開(kāi)文件的后綴來(lái)過(guò)濾出自己想得到的文件類型,然后在生成的程序中通過(guò)點(diǎn)擊打開(kāi)或者新建這樣的按鈕,在標(biāo)準(zhǔn)的windows對(duì)話框下實(shí)現(xiàn)文件的打開(kāi)?墒俏覀兛吹侥J(rèn)的這個(gè)對(duì)話框并不是我們?cè)趙in2000中所常見(jiàn)的那種左邊也有選擇框的標(biāo)準(zhǔn)對(duì)話框,而是老式的對(duì)話框,這一點(diǎn)影響了大家的心情了吧?MFC也有點(diǎn)欺人太甚了,哼哼。
當(dāng)然這種現(xiàn)象不是不可以解決的,不是有CFileDialog么?只要自己來(lái)實(shí)現(xiàn)OnOpenFile,在其中使用CFielDialog不就可以了么。MSDN上也是這樣來(lái)建議你設(shè)置自己的打開(kāi)對(duì)話框的。有個(gè)很常見(jiàn)的文章講到了這一點(diǎn)。由于MFC在文件對(duì)話框中都使用了對(duì)話框鉤子函數(shù),所以修改2000對(duì)話框的風(fēng)格需要對(duì)OPENFILENAME結(jié)構(gòu)中l(wèi)StructSize的值做改動(dòng),變成88就行了。這是一種常見(jiàn)的方法,實(shí)際上就是進(jìn)行了一些表面的工作,改改參數(shù)就可以了。
在實(shí)際MFC程序中,要是使用OnOpenDocument這個(gè)函數(shù)了的話,就不能通過(guò)簡(jiǎn)單的在OnOpenFile函數(shù)中使用CFielDialog來(lái)處理了。在MSDN上,有一個(gè)Q&A,給出了兩個(gè)類來(lái)欺騙MFC從而實(shí)現(xiàn)真正自己改動(dòng)的打開(kāi)文件對(duì)話框。下面給出代碼例子:
“2000形式的打開(kāi)!”
原文章:http://msdn.microsoft.com/msdnmag/issues/0800/c/default.aspx
app.cpp中:
#include "StdAfx.h"
#include "TestFD.h"
#include "MainFrm.h"
#include "View.h"
#include "DocMgrEx.h"
#include "FileDialogEx.h"
#include "TraceWin.h"
BOOL CMyApp::InitInstance()
{
SetRegistryKey("MSJ"); // Save settings in registry, not INI file
LoadStdProfileSettings();
// Load standard INI file options (including MRU)
file://加在這里哦!Flags和Filter加在CDocManagerEx.cpp中
// use extended CDocManager for new file open dialog
m_pDocManager = new CDocManagerEx;
AddDocTemplate(new CSingleDocTemplate(IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CMyView)));
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
return TRUE;
}
CDocManagerEx.cpp中:
BOOL CDocManagerEx::DoPromptFileName(CString& fileName, UINT nIDSTitle,
DWORD lFlags, BOOL bOpenFileDialog, CDocTemplate* pTemplate)
{
// modified 5-15-99 PD: call virtual fn to create dialog
CFileDialog* pDlg = OnCreateFileDialog(bOpenFileDialog);
ASSERT(pDlg);
CFileDialog& dlgFile = *pDlg;
CString title;
VERIFY(title.LoadString(nIDSTitle));
file://在這里改造文件打開(kāi)的屬性
dlgFile.m_ofn.Flags = OFN_FILEMUSTEXIST OFN_ALLOWMULTISELECT OFN_ENABLEHOOK;//lFlags;
CString strFilter;
CString strDefault;
if (pTemplate != NULL)
{
ASSERT_VALID(pTemplate);
_AfxAppendFilterSuffix(strFilter, dlgFile.m_ofn, pTemplate, &strDefault);
}
else
{
// do for all doc template
POSITION pos = m_templateList.GetHeadPosition();
BOOL bFirst = TRUE;
while (pos != NULL)
{
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
_AfxAppendFilterSuffix(strFilter, dlgFile.m_ofn, pTemplate,
bFirst ? &strDefault : NULL);
bFirst = FALSE;
}
}
// append the "*.*" all files filter
CString allFilter;
VERIFY(allFilter.LoadString(AFX_IDS_ALLFILTER));
strFilter += allFilter;
strFilter += (TCHAR)'\0'; // next string please
strFilter += _T("*.*");
strFilter += (TCHAR)'\0'; // last string
dlgFile.m_ofn.nMaxCustFilter++;
file://Filter文件加在這里!哈哈
dlgFile.m_ofn.lpstrFilter = "圖象文件\0*.bmp;*.jpg\0所有文件\0*.*\0\0\0";
dlgFile.m_ofn.lpstrTitle = title;
dlgFile.m_ofn.lpstrFile = fileName.GetBuffer(_MAX_PATH);
int nResult = dlgFile.DoModal();
fileName.ReleaseBuffer();
// modified 5-15-00 PD: delete dialog
delete pDlg;
return nResult == IDOK;
}
好啦,夠用了吧,很簡(jiǎn)單了。