win2000下“開啟”對話方塊實現2000的風格綜述 (轉)

worldblog發表於2008-01-31
win2000下“開啟”對話方塊實現2000的風格綜述 (轉)[@more@]

本人天大小碩,平時使用MFC處理影像。我生成可的目的不求介面多麼pp,只是覺得很簡單的介面應該可以讓人隨心所欲地為己所用,於是乎網上求知,現總結一下已經得到有關開啟對話方塊的實現方法,希望可以給初學者添點樂趣。

一般而言,在使用VC新建一個工程時可以選擇所要開啟檔案的字尾來過濾出自己想得到的檔案型別,然後在生成的程式中透過點選開啟或者新建這樣的按鈕,在標準的windows對話方塊下實現檔案的開啟。可是我們看到預設的這個對話方塊並不是我們在中所常見的那種左邊也有選擇框的標準對話方塊,而是老式的對話方塊,這一點影響了大家的心情了吧?MFC也有點欺人太甚了,哼哼。

當然這種現象不是不可以解決的,不是有CFileDialog麼?只要自己來實現OnOpenFile,在其中使用CFielDialog不就可以了麼。MSDN上也是這樣來建議你設定自己的開啟對話方塊的。有個很常見的文章講到了這一點。由於MFC在檔案對話方塊中都使用了對話方塊鉤子,所以修改2000對話方塊的風格需要對OPENFILENAME結構中lStructSize的值做改動,變成88就行了。這是一種常見的方法,實際上就是進行了一些表面的工作,改改引數就可以了。

在實際MFC程式中,要是使用OnOpenDocument這個函式了的話,就不能透過簡單的在OnOpenFile函式中使用CFielDialog來處理了。在MSDN上,有一個Q&A,給出了兩個類來欺騙MFC從而實現真正自己改動的開啟檔案對話方塊。下面給出程式碼例子:

“2000形式的開啟!”

原文章:.com/msdnmag/issues/0800/c/default.x">

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)

 在這裡哦!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 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,
  D 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));

  這裡改造檔案開啟的屬性
  dlgFile.m_ofn.Flags |= OFN_FILEMUSTEXIST|OFN_ALLOWMULTI|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 p= 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)';  // next string please
  strFilter += _T("*.*");
  strFilter += (TCHAR)';  // last string
  dlgFile.m_ofn.nMaxCustFilter++;

  檔案加在這裡!哈哈
  dlgFile.m_ofn.lpstrFilter = "圖象檔案*.bmp;*.jpg所有檔案*.*";
  dlgFile.m_ofn.lpstrTitle = title;
  dlgFile.m_ofn.lpstrFile = fileName.GetBuffer(_MAX_PATH);

  int nResult = dlgFile.odal();
  fileName.ReleaseBuffer();

  // modified 5-15-00 PD: delete dialog
  delete pDlg;

  return nResult == IDOK;
}

好啦,夠用了吧,很簡單了。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998964/,如需轉載,請註明出處,否則將追究法律責任。

相關文章