ファイルを開くダイアログ作成方法と拡張子の対象変更方法

このQ&Aのポイント
  • ファイルを開くのダイアログを作成する方法と、拡張子の対象を変更する方法について説明します。
  • 指定のプログラムでファイルを開くためのダイアログを作成する方法と、拡張子の対象を変更する方法を解説します。
  • VC6.0でのファイルを開くダイアログの作成方法と、拡張子の対象を複数指定する方法について詳しく説明します。
回答を見る
  • ベストアンサー

「ファイルを開く」のダイアログ作成

ファイルを開くのダイアログを作成しています。 CEdit *wdit; FileDialog wdlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY, "A系ファイル(*.a)|*.a|" "A系ファイル(*.b)|*.b|" "A系ファイル(*.c)|*.c||"); if(wdlg.DoModal()==IDOK){  wdit = (wdit*)GetDlgItem(IDC_EDIT1);  wdit->SetWindowText(wdlg.GetPathName()); } 上のようなプログラムだと、A系ファイルを選択したときに対象となる拡張子が1つになります。 利便性を考えて、A系ファイルを選択すると、*.aと*.bと*.cの3つの拡張子が対象となる様に書き換えたいのですが、どのようにすればよいでしょうか? VC6.0で奮闘しています。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

http://hp.vector.co.jp/authors/VA023539/tips/dialog/004.htm のlpstrFilterの項目を。 ということで、"*.a;*.b;*.c"になるかと。 MFCだと、指定方法がちょっと違いますが、大差ないでしょう。 試せば判るかと。 # SDKだと、"A系ファイル(*.a)\0*.a\0A系ファイル(*.b)\0*.b\0A系ファイル(*.c)\0*.c\0"ですが…。MFC変換する処理が入っているので。

enjoy-ride
質問者

お礼

回答ありがとうございます。 Wr5さんの方法で無事解決しました。

関連するQ&A

  • VC++でファイルが開けないんです

    以下のようなプログラムを作っています。 実行内容としては、 MessageBoxでYesNo選択 ↓ Yesなら~~という処理、 Noなら、ファイルの選択画面を立ち上げて、ファイルを選択。ReStartという関数にそのファイル名を渡す ↓ そのあと、現在時間を取得して、filename4というファイルに追加書き込みをする。 という処理です。 ここで、私はfilename4=./time/AAA.timeと指定しているのですが、 Yes処理のあとはうまくfileが開けて書き込めるのですが、No処理のあとはfileが開けないんです。 おそらくは、No処理の中のファイル選択で、VC++のプロジェクトがあるディレクトリと違うディレクトリから選択しているせいだと思うんですが、これを解消する方法はありますでしょうか?? VC++短いんで、もし単純でしたら申し訳ないですが、どうぞよろしくお願いします。 ------------------------------------------- ・・・ if(MessageBox("はじめから?", "message", MB_YESNO)==IDYES){ ~~} else{ CFileDialog fd(TRUE,"","",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_LONGNAMES, "位置ファイル (*.POSI)|*.POSI|" "全てのファイル(*.*)|*.*||", NULL); if(fd.DoModal()==IDOK){ posifilename = fd.GetPathName(); } ReStart(posifilename); } stream4 = fopen(filename4,"a"); if(stream4 == NULL ){ MessageBox("Cannot Open the File!!", "error", MB_OK); } strwork4.Format("%ld,",time(NULL)); fprintf(stream4,strwork4); fclose(stream4);

  • メインダイアログを表示させずにファイル選択ダイアログを表示

    VC++2005のMFCダイアログベースでプログラムを作成しています。 自動生成されたプログラムを何も変更しないまま実行すると、 メインのダイアログが表示されますが、 そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。 自分で実装しビルド実行したところ、期待動作をしましたが、 ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。 エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、 ご教示お願い致します。 【変更実装(エラー発生)】 BOOL CtestApp::InitInstance() { … CtestDlg dlg; m_pMainWnd = &dlg; // INT_PTR nResponse = dlg.DoModal(); //コメントアウト dlg.OnBnClickedButton1(); //ファイル選択ダイアログを表示する関数 //if (nResponse == IDOK) //コメントアウト //else if (nResponse == IDCANCEL) //コメントアウト … } void CtestDlg::OnBnClickedButton1() { CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); … }

  • VB6.0で、APIのダイアログボックスを使い複数のファイル名を取得したいのですが

    以下のサイトのファイルを開くコードを引用して、なんとかダイアログボックスをマルチセレクトにするところまではできました。 以下のコードを実行すると、strFileNameにファイルが入っているフォルダのパス名だけが取得されます。複数のファイル名を取得したいのですが。 どこを直せばいいのかわからず教えていただきたいのですが。 アドバイスお願いいたします。 "http://www.red.oit-net.jp/tatsuya/vb/FileDialog.htm" 以下、追加したコードです。---------------------------- Public Const OFN_LONGNAMES = &H200000 '旧スタイルのダイアログのとき、ロングファイル名を使用可能にする Public Const OFN_EXPLORER = &H80000 'エクスプローラ型ダイアログとして表示 '構造体の設定 With OFN .Flags = OFN_PATHMUSTEXIST Or _ OFN_FILEMUSTEXIST Or _ OFN_HIDEREADONLY Or _ OFN_ALLOWMULTISELECT Or OFN_EXPLORER 'マルチセレクト追加

  • CFileDialogで保存したい

    VC++でMFCのCEditViewを利用して作るテキストエディタ(プロジェクト名:Cell Compiler)に、最初からついているやつとは別にテキストの保存機能をつけたいのですが、どうすればよいですか? とりあえずCell Compilerdoc.cppファイルの中に、下記のような関数を作ってみたのですが(作る場所違う?)、その後が分かりません。 void CCellCompilerDoc::OnFileSaveProject() { CFileDialog dlg( FALSE, "*.*", "test.cell",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"cellファイル (*.cell)|*.cell|All Files (*.*)|*.*||", NULL); if( dlg.DoModal() == IDOK) { dlg.GetFileExt(); dlg.GetFileName(); dlg.GetFileTitle(); dlg.GetPathName(); } } 多分、if文の中に、保存する処理を加えるのかな?と思っているのですが、どうですか?ちなみに上記のソース追加以外は、何もいじってません。よろしくお願いします。

  • 画像の保存方法。

    VC++のMFC、ダイアログベースで画像処理のソフトを開発している者です。 ピクチャーコントロールに画像を表示させて、その画像を保存したいと思っています。 保存用のダイアログを開き、名前を付けて保存したいのですがうまくいきません。 下が今作っているプログラムです。 void Cstart2Dlg::OnBnClickedButton10() { CFileDialog myDLG(FALSE,"BMP","*.BMP", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "画像(*.BMP)|*.BMP||"); if(myDLG.DoModal() == IDOK){ CStdioFile fout(myDLG.GetPathName(),CFile::modeCreate |CFile::modeWrite|CFile::typeBinary); UpdateData(TRUE); fout.WriteString(m_pict8); fout.WriteString("\xla"); filename = myDLG.GetPathName(); SetWindowText("start2"+filename); } ピクチャーコントロールの変数をm_pict8にしています。テキストファイルを保存するプログラムを参考にして作っているので間違っているのだと思います。 画像の保存方法が分かる方がいらっしゃいましたらよろしくお願いいたします。

  • ファイルを開きたいのですが、うまくいかなくて困っています。

    ファイルを開きたいのですが、うまくいかなくて困っています。 以下のソースですが、デバッグしながらやっているので謎な部分があるかもしれません。 やりたいこと: ・実行ボタンを押すと"data/test.txt"を開き、OK部の処理に入りたい。 現状: ・参照ボタンを押した後、ファイル選択ダイアログで[開く]を押した後、実行ボタンを押すとエラー ・参照ボタンを押した後、ファイル選択ダイアログで[キャンセル]を押した後、実行ボタンを押すとOK ・"data/test.txt"は存在します。"r"を"w"にして作成してみたりした為、間違いないと思います。 VC++(MFC)でプログラミングしています。 自力解決が難しい為、お力を貸してくださいm(__)m [環境] OS: Windows XP SP3 tools: VisualStudio2008 //**************************************************************** // 参照ボタン //**************************************************************** void CMergeFile::OnBnClickedButtonRef02() { static char BASED_CODE szFilter[] = "Text Files(*.txt)|*.txt|All Files(*.*)|*.*||"; // ファイルの指定を行う CFileDialog dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST, zFilter, NULL ); dlg.m_ofn.lpstrTitle = "取り込むファイルを選択"; // OKボタンが押されたかチェックする if( dlg.DoModal() == IDOK ){ // ファイル名称クリア処理 ※fileNameはメンバ変数として外に持っています。 memset( fileName, '\0', sizeof(fileName) ); // ファイル名を取得する strcpy( fileName,dlg.GetPathName()); } else { return; } // 選択ファイル名を表示する m_edit_filepath.SetWindowText(fileName); } //**************************************************************** // 実行ボタン //**************************************************************** void CMergeFile::OnBnClickedButtonExe02() { FILE *fpBase = 0; fpBase = fopen("data/test.txt", "r"); if ( fpBase == NULL ){ MessageBox("err"); // エラー } else { MessageBox("ok"); // OK fclose(fpBase); } }

  • VB6.0のマルチセレクトダイアログで250個のファイルを選択したいの

    VB6.0のマルチセレクトダイアログで250個のファイルを選択したいのですがエラーが出ます。 10個程度の選択ならエラーが出ません。 どこをどう修正したら多数のファイル選択が可能になるのでしょうか? どなたかわかる方教えてください。 どうぞよろしくお願いいたします。 エラー内容:下記のGetFileNameが空でファイル名を取得できない。 Dim GetFileName As Variant 'ファイル名(フルパス) GetFileName = apiGetOpenFileName(Form1.hWnd, strFilter, strDir) 'ダイアログ表示 使用したコード:下記リンク先のコードにマルチセレクト用のコードを追加しました。 "?http://www.red.oit-net.jp/tatsuya/vb/FileDialog.htm"? 以下、追加したコードです。---------------------------- Public Const OFN_LONGNAMES = &H200000 '旧スタイルのダイアログのとき、ロングファイル名を使用可能にする Public Const OFN_EXPLORER = &H80000 'エクスプローラ型ダイアログとして表示 '構造体の設定 With OFN .Flags = OFN_PATHMUSTEXIST Or _ OFN_FILEMUSTEXIST Or _ OFN_HIDEREADONLY Or _ OFN_ALLOWMULTISELECT Or OFN_EXPLORER 'マルチセレクト追加

  • VisualC++ ファイル読み込み

    前回の質問が曖昧との意見もありもう1度きちんとした内容で質問したいと思います。現在VisualC++6.0でファイルの入出力について学んでおります。 void(){ FILE *p; CString a; cha buf[1001]; CFileDialog fdlg(TRUE,"","*.*"); if(fdlg.DoModal()!=IDOK) return; a=fdlg.GetPathName(); CEdit *p; p=(CEdit *)GetDlgItem(IDC_EDIT1); if((fp=fopen(a,"r"))==NULL) return while(fgets(buf,1000,fp)!=NULL){ buf[strlen(buf)-1]='\0'; strcat(buf,"\r\n"); int n=p->GetWindowTextLength(); p->SendMessage(EM_SETSEL,n,n); p->SendMessage(EM_REPLACESEL,0,(LPARAM)buf); } fclose(fp); } というプログラムでダイアログのEditボックスにファイルを読み込み 一行ずつ貼り付けていくという作業ができました。 このプログラムにさらに文字と数字を切り分けて表示する作業を組み込みたいのです。 例えば1行目に M02M61X0.F2.5B1FG1231などが書かれているテキストファイルを [M][02][M][61][x][0.][F][2.5][B][1][FG][1231] などのように分けて表示するプログラムです。 断片的なアドバイスで構いません。 教えてください

  • UNICODEファイルが文字化けする

    どうしてもうまくいかず質問致します。 Visual Studio2008のMFCで、下記のコードでUnicodeファイルを読み込むと、文字化けします。  なぜでしょうか? 文字セットは、Unicodeにしています。 ログを調べているとsetlocaleや_wsetlocaleを使うとうまくいっているようですが、この環境では 解決しません。 CFileDialog seldel(TRUE, NULL,NULL, OFN_HIDEREADONLY,NULL); if(seldel.DoModal()==IDOK) { CString cpath=seldel.GetPathName(); CStdioFile cFile; cFile.Open(cpath,CFile::modeRead | CFile::shareDenyNone);// == FALSE) CString cs, cs_all; while(cFile.ReadString(cs)==TRUE) { cs_all+=cs; } ::AfxMessageBox(cs_all); } どうぞよろしくお願い致します。

  • UWSCでファイルダイアログからフルパスを取得したい(APIコード有り)

    UWSCでダイアログを表示し、ユーザーにファイルを選択させ、Excelファイルをオープンしたいと思っています。ファイルダイアログのソースはネットで見つけました。 しかし、APIの知識はまったく無いので下記コードの意味がわかりません。 最終的にやりたいことは、戻値 = XLOPEN( [ファイル名] ) 関数を利用して、「ファイル名」の所にユーザーが選択したファイルのフルパスを入力したいです。 下記のAPIのコードを使ってどのようにフルパスを取得することができますでしょうか? よろしくお願いいたします。 ///////////////////////////////////////////////////////////////////////////////   v_Path = FileOpenDLG.Get(v_Path)   Module FileOpenDLG     DEF_DLL GetOpenFileNameA({Long, Long, Long, var string, var string, Long, Long _                  , var pchar, Long, var pchar, Long, var string, var string _                  , Long, DWORD, var string, Long, Long, var string}): Bool: COMDLG32     CONST STRUCT_SIZE = 76   // 構造体のサイズ     CONST OFN_HIDEREADONLY = $4   // 書き込み禁止(Read Only)のチェックボックスを非表示。     CONST OFN_FILEMUSTEXIST = $1000  // 存在しないファイルを選択できないようにする。     CONST OFN_EXPLORER = $80000 // ダイアログボックスをエクスプローラ風にする。     Dim Flag = OFN_HIDEREADONLY or OFN_FILEMUSTEXIST or OFN_EXPLORER     Dim Len_1024 = $400     Dim Buff_1024 = Format(ChrB(0), This.Len_1024)     Dim Name     Dim Title = "Excelファイルを選択。"     Dim ExtFilter = "Excel (*.xls)" + ChrB(0) + "*.xls" + ChrB(0) _             + "全て (*.*)" + ChrB(0) + "*"     Dim DefaultDir = null  // 初期表示ディレクトリ null は CurrentDirectory。     Function Get(var v_Path)       v_Path = This.Buff_1024       This.Name = This.Buff_1024       Result = GetOpenFileNameA(_         STRUCT_SIZE, 0, 0, This.ExtFilter + ChrB(0), NULL, 0, 0 _         , v_Path, This.Len_1024, This.Name, This.Len_1024, This.DefaultDir, This.Title _         , This.Flag, 0, NULL, 0, 0, NULL)     FEnd   EndModule ///////////////////////////////////////////////////////////////////////////////

専門家に質問してみよう