在mfc的文档/视图结构中,缺省就会产生
打开文件对话框。在资源文件中:
IDR_YOURFRAME
 "YourFrame\n"    //application window caption
 "\n"               //root for default document name (Untitled)
 "YourFrame\n"    //document type name
 "YourFrame Files(*.txt)\n" //document type description and filter
 ".txt\n"          //extension for documents of this type
 "YourFrame.Document\n" //Registry file type ID
 "YourFrame Document"   //Registry file type description这样.txt就会自动加入到文件过滤器中。
但是我想
要向这个打开文件对话框中多加几种文件扩展名,该
怎么办?”
比如.bmp .jpg 

解决方案 »

  1.   

    总的思路是这样的:
    1 你可以用SDI框架实现,一个Document多个View.在Document打开文件时,你可以根据
    文件扩展名去读不同格式的文件,并保存数据并标识出是哪一种数据类型,在view中显
    示时,这就可以动态地去选择.
    不用定义多个文档,只定义一个就行了,在资源管理器中建立多个view,在insert source中插入IDD_FORMVIEW就是了,然后建立一个全局变量,这个变量决定你新打开一个文档时用那个view,如下:
    BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    extern int isview ;
    if (isview == 0 ) {
    return CMDIChildWnd::OnCreateClient(lpcs, pContext); //classwizard 自动建立的第一个View
    }
    if ( isview == 2 ) {  

    pContext->m_pNewViewClass = RUNTIME_CLASS(report1);//你自己后来新建立的view
    return CMDIChildWnd::OnCreateClient(lpcs, pContext);

    }
    return true ;

    }2 用MDI框架实现,其实这也挺简单的.因为MDI可以支持多个文档模板.这样打开不同的
    数据文件时,你可以用不同的文档模板去打开.找几个简单例子看看就知道了.其实两种途径你都可以选,关键是那一种界面更适合你.
      
    实现
    APP类的InitInstance()函数中有如下代码:
    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(
    IDR_MY12STYPE,
    RUNTIME_CLASS(CMy12sDoc),
    RUNTIME_CLASS(CChildFrame),
                      RUNTIME_CLASS(CMy12sView));
    AddDocTemplate(pDocTemplate);
    以上代码就是添加一个文档模板,你可以按自己的要求随意添加:
    如:
    pDocTemplate = new CMultiDocTemplate(
    IDR_OTHERTYPE,     //相关菜单,自己新建
    RUNTIME_CLASS(COtherDoc),   //新建文档类
    RUNTIME_CLASS(COtherChildFrame), //新建子框架类
                      RUNTIME_CLASS(COtherView));  //新建视图类
    AddDocTemplate(pDocTemplate);
      

  2.   

    还有一种办法,
    重载OnFileOpenvoid CXXXXApp::OnFileOpen() 
    {
    static char BASED_CODE szFilter[] = "All Image Files|*.bmp;*.DIB;*.pcx;*.tif;*.gif;|*.BMP Windows Bitmap(*.bmp;*.DIB)|*.bmp;\
    *.DIB|PCX PCX(*.pcx)|*.pcx;|TIFF Tag Image File Format(*.tif)|*.tif|GIF CompuServe GIF|*.gif|All Files (*.*)|*.*||";
    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL);
    if (dlg.DoModal() != IDOK)  return;
    if(!OpenDocumentFile(dlg.m_ofn.lpstrFile))
    AfxMessageBox("Read Error!");
    }
      

  3.   

    static char BASED_CODE szFilter[] = "All Image Files|*.bmp;*.DIB;*.pcx;*.tif;*.gif;|*.BMP Windows Bitmap(*.bmp;*.DIB)|*.bmp;\
    *.DIB|PCX PCX(*.pcx)|*.pcx;|TIFF Tag Image File Format(*.tif)|*.tif|GIF CompuServe GIF|*.gif|All Files (*.*)|*.*||";
    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL);
      

  4.   

    重载OnFileOpen的方法我知道。谢谢各位!
      

  5.   

    但是重载OnFileOpen以后,那个Recent File好像就有问题了,不能正确的对应到最近打开的文件了。有人试过吗?我试了就是有问题。
      

  6.   

    : zhuflower(catpig)
    我同意你的说法!!
      

  7.   

    我想知道如果不用重载OnFileOpen的方法,用cbc(逍遥子) 提到的用sdi的方法,如果我的所有的文件格式的view都一样,那么改如果改写
    pDocTemplate = new CMultiDocTemplate(
    IDR_OTHERTYPE,     //相关菜单,自己新建
    RUNTIME_CLASS(COtherDoc),   //新建文档类
    RUNTIME_CLASS(COtherChildFrame), //新建子框架类
                      RUNTIME_CLASS(COtherView));  //新建视图类
    AddDocTemplate(pDocTemplate);
    我想
    RUNTIME_CLASS(COtherChildFrame), //新建子框架类
    RUNTIME_CLASS(COtherView));  //新建视图类
    就用原来的就可以了吧,而RUNTIME_CLASS(COtherDoc)是否要加入新的doc类呢?以及其他地方需要做什么修改吗?