win2000下“打开”对话框实现2000的风格综述 (转)

win2000下“打开”对话框实现2000的风格综述 (转)[@more@]

本人天大小硕,平时使用vc MFC处理图像。我生成可执行程序的目的不求界面多么pp,只是觉得很简单的windows界面应该可以让人随心所欲地为己所用,于是乎网上求知,现总结一下已经得到有关打开文件对话框的实现方法,希望可以给初学者添点乐趣。

一般而言,在使用VC新建一个工程时可以选择所要打开文件的后缀来过滤出自己想得到的文件类型,然后在生成的程序中通过点击打开或者新建这样的按钮,在标准的windows对话框下实现文件的打开。可是我们看到默认的这个对话框并不是我们在win2000中所常见的那种左边也有选择框的标准对话框,而是老式的对话框,这一点影响了大家的心情了吧?MFC也有点欺人太甚了,哼哼。

当然这种现象不是不可以解决的,不是有CFileDialog么?只要自己来实现OnOpenFile,在其中使用CFielDialog不就可以了么。MSDN上也是这样来建议你设置自己的打开对话框的。有个很常见的文章讲到了这一点。由于MFC在文件对话框中都使用了对话框钩子函数,所以修改2000对话框的风格需要对OPENFILENAME结构中lStructSize的值做改动,变成88就行了。这是一种常见的方法,实际上就是进行了一些表面的工作,改改参数就可以了。

在实际MFC程序中,要是使用OnOpenDocument这个函数了的话,就不能通过简单的在OnOpenFile函数中使用CFielDialog来处理了。在MSDN上,有一个Q&A,给出了两个类来欺骗MFC从而实现真正自己改动的打开文件对话框。下面给出代码例子:

“2000形式的打开!”

原文章:microsoft.com/msdnmag/issues/0800/c/default.ASPx">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)';  // next string please
  strFilter += _T("*.*");
  strFilter += (TCHAR)';  // last string
  dlgFile.m_ofn.nMaxCustFilter++;

  file://Filter文件加在这里!哈哈
  dlgFile.m_ofn.lpstrFilter = "图象文件*.bmp;*.jpg所有文件*.*";
  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;
}

好啦,够用了吧,很简单了。

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-998964/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-998964/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值