本人天大小碩,平時使用VC MFC處理圖像。我生成可執行程序的目的不求界面多么pp,只是覺得很簡單的windows界面應該可以讓人隨心所欲地為己所用,于是乎網上求知,現總結一下已經得到有關打開文件對話框的實現方法,希望可以給初學者添點樂趣。
一般而言,在使用VC新建一個工程時可以選擇所要打開文件的后綴來過濾出自己想得到的文件類型,然后在生成的程序中通過點擊打開或者新建這樣的按鈕,在標準的windows對話框下實現文件的打開?墒俏覀兛吹侥J的這個對話框并不是我們在win2000中所常見的那種左邊也有選擇框的標準對話框,而是老式的對話框,這一點影響了大家的心情了吧?MFC也有點欺人太甚了,哼哼。
當然這種現象不是不可以解決的,不是有CFileDialog么?只要自己來實現OnOpenFile,在其中使用CFielDialog不就可以了么。MSDN上也是這樣來建議你設置自己的打開對話框的。有個很常見的文章講到了這一點。由于MFC在文件對話框中都使用了對話框鉤子函數,所以修改2000對話框的風格需要對OPENFILENAME結構中lStructSize的值做改動,變成88就行了。這是一種常見的方法,實際上就是進行了一些表面的工作,改改參數就可以了。
在實際MFC程序中,要是使用OnOpenDocument這個函數了的話,就不能通過簡單的在OnOpenFile函數中使用CFielDialog來處理了。在MSDN上,有一個Q&A,給出了兩個類來欺騙MFC從而實現真正自己改動的打開文件對話框。下面給出代碼例子:
“2000形式的打開!”
原文章: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://在這里改造文件打開的屬性 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; }
好啦,夠用了吧,很簡單了。
|