VC++6.0でMDIプログラムを作成しているものです。

このQ&Aのポイント
  • 子ウィンドウをダブルクリックすると「ファイルを開く」のコモンダイアログを呼び出し、選択した画像ファイルを表示させるプログラムを作成しましたが、別のウィンドウをアクティブにすると表示したファイル名が戻ってしまいます。子ウィンドウが複数あっても画像のファイル名をタイトルバーに表示したいです。
  • VC++6.0でMDIプログラムを作成し、画像ファイルを表示するプログラムを作成しましたが、別のウィンドウをアクティブにするとタイトルバーに表示したファイル名が消えてしまいます。子ウィンドウが複数あってもファイル名を表示できるようにするにはどうすればよいでしょうか。
  • VC++6.0でMDIプログラムを作成し、画像ファイルの表示プログラムを開発しました。しかし、別ウィンドウをアクティブにするとファイル名の表示が消えてしまいます。画像ファイルの表示を確認しながら、子ウィンドウのタイトルにファイル名を表示する方法を教えてください。
回答を見る
  • ベストアンサー

VC++6.0,MDI,子ウィンドウのタイトルが変わる!?

VC++6.0でMDIプログラムを作成しているものです. 子ウィンドウをダブルクリックすると「ファイルを開く」のコモンダイアログを呼び出し,そこに選択した画像ファイルを表示させるプログラムを作ったのですが,ついでにタイトルバーに開いたファイル名を以下のようにして表示させました. // Viewクラスにて CFileDialog dlg(TRUE, "bmp", "*.bmp",               OFN_HIDEREADONLY|         OFN_OVERWRITEPROMPT,        "BITMAP(*.bmp)|         *.bmp|JPEG(*.jpg)|         *.jpg||"); if (dlg.DoModal() != IDOK) { return; } GetParent()->SetWindowText(dlg.GetFileName()); そして,画像を表示したウィンドウとは別のウィンドウをアクティブにすると,タイトルバーに表示したファイル名がウィンドウを生成したときのタイトルに戻ってしまいます. 子ウィンドウが何個あっても,表示している画像のファイル名をタイトルバーに表示したいのですが,どうすればいいのですか?

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

  • ベストアンサー
回答No.1

まったくもって自身がないのですが、ひょっとして、 [アクティブから外れる]=[スコープから外れる]になっていることなんですかね(それでインスタンス作成時のタイトルになってしまうので)?試していただきたいことはCViewから派生、もしくはそれ自身を基底クラスとした自作派生クラス(本文の[// Viewクラスにて]クラス)に文字列型の変数orクラス[A]などを定義しそれにセットして(strcpyとかで)から派生もとのSetWindowText([A])メソッドを実行した後、UpdateData()を呼べばできるかと思います。申し訳ないのですが期待する結果が得らる保障はできませんのでご了承ください。

mkmarimo
質問者

お礼

ご回答ありがとうございます.お礼が遅れてしまい、申し訳ありません.試してみたいと思います.ありがとうございました.

関連するQ&A

  • 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にしています。テキストファイルを保存するプログラムを参考にして作っているので間違っているのだと思います。 画像の保存方法が分かる方がいらっしゃいましたらよろしくお願いいたします。

  • ファイルダイアログでのファイルの複数選択について

    VC++6.0でプログラムをしているのですが、CFileDialogクラスのコモンダイアログでファイルを開くときに、ファイルを複数選択できるようにしています。 しかし、試してみると14枚までしか開くことができません。プログラムは以下のとおりです。 CFileDialog dlg(TRUE, "bmp", "*.bmp", OFN_ALLOWMULTISELECT); if (dlg.DoModal() != IDOK) { return; } ファイルを15枚以上選択するとif文の中のreturnに入って関数を抜けてしまいます。原因が何なのか分かる方教えてください。

  • AVIファイルがうまく表示できません

    CCDカメラ「webcam」で用意したAVI形式のファイルを 再生できるような物をVC++で作ってみたのですが いざ実行してみると画面が4分割されて表示されてしまいます。しかも上下左右のコマの順番がめちゃくちゃで。 プログラムは本に載っていたものを丸写しで、 他のAVI形式のアニメーションは正常に表示されます。 webcamで撮ったものだけだめなんです。 VC++初心者のため原因がわからず困っています。 どなたか知恵をお貸しください! ↓ファイルを読み込むボタンの中身です。 // コモンファイルダイアログを呼び出すためのオプションを指定する   CFileDialog dlg(TRUE, _T("AVI"), _T("*.AVI"),   OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,         _T("Animation (*.AVI)|*.AVI|")); // [OK]ボタンがクリックされて復帰したときの処理   if( dlg.DoModal()==IDOK )   { // AVIファイルのパス名を取得する   m_strFilename = dlg.GetPathName(); // フォームビューの内容を更新する   UpdateData(FALSE); // ウィンドウの属性を変更する m_dwStyle = WS_CHILD|WS_VISIBLE;   SetWindowLong(m_Animate.GetSafeHwnd(),   GWL_STYLE, m_dwStyle); // AVIファイルを開く   m_Animate.Open(m_strFilename); }

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

    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 ); … }

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

    ファイルを開きたいのですが、うまくいかなくて困っています。 以下のソースですが、デバッグしながらやっているので謎な部分があるかもしれません。 やりたいこと: ・実行ボタンを押すと"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); } }

  • 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);

  • cvLoadImageを使用するとプロセスが終了できません。

    cvLoadImageを使用するとプロセスが終了できません。 OpenCV1.1を使用して開発を行っているのですが、OpenCVの関数であるcvLoadImageとMFCのクラスであるCFileDialogを一緒に使用した場合、アプリケーションの終了時にプロセスが残ってしまいます。 デバッグ実行の場合、完全に終了まで至らない。 リリースビルドの実行ではタスクマネージャで確認する限りプロセスが残っています。 この現象は以下のコードを実行した場合発生しているようです。 逆に言えばこのコードを実行しなければ正常に終了します。 ■現象の発生するコード   IplImage* pImage ;   CString strFilePath = "c:\\a.jpg";   CFileDialog dlg(  TRUE,             NULL,             NULL,             OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,             _T("すべてのファイル(*.*)|*.*||")           ) ;   if( IDOK == dlg.DoModal() ) {     strFilePath = dlg.GetPathName() ;     TRACE( "%s\n", strFilePath ) ;     pImage = cvLoadImage( strFilePath , 1 ) ;     cvReleaseImage( &pImage ) ;     } http://questionbox.jp.msn.com/qa5084716.html ここを読むと似たような現象で、回避方法としてOpenCV1.0にすると書かれています。 関数やコンパイラの環境、症状がやや異なるので、同じかどうかは分かりませんが、なんとかOpenCV1.1でCFileDialogを使用したいのです。 よい回避方法がありましたらお教えください。 よろしくお願いします。 ■開発環境 ・VC++6.0 ・OpenCV1.1pre ・WindowsXP OpenCV2.0への変更とVC++6.0以外のコンパイラへの変更は考えていません。

  • クリップボードからJpgファイルへの保存方法(画質について)

    クリップボードにコピーされたデスクトップの画面を Jpgファイルに落とすプログラムです。 クリップボードから情報を取得してjpgファイルを作成することはできるのですが、画質が悪く (白黒のように)なってしまうのですが、なぜなのかわかりません。 アドバイスお願いします。 if (IsClipboardFormatAvailable(CF_DIB )) { ::OpenClipboard(NULL); HGLOBAL hGlobal; hGlobal = (HGLOBAL)::GetClipboardData(CF_DIB ); if( hGlobal == NULL ){ AfxMessageBox( "クリップボードへコピーできませんでした" ); return; } //ファイルに保存 ///////////////////// const CString szPptFilter = _T("PowerPoint Files (*.ppt)|*.ppt|"); CString szFilter = szPptFilter + _T("|"); CFileDialog dlg(FALSE, _T("ppt"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szPptFilter); if( dlg.DoModal() == IDOK ) { double lfProp = 1.0; TCHAR szTemp[_MAX_PATH]; BOOL bTemp = (GetTempPath(_MAX_PATH, szTemp) == 0)? FALSE:TRUE; CString szTempPath = bTemp? szTemp:_T("c:\\"); CString szFileName = szTempPath + _T("_") + "JpegFile" + _T(".jpg"); void *pDIB = GlobalLock( hGlobal ); CDib dib((BYTE*)pDIB); CPicObject::EPicKind eKind = CPicObject::GetKind(szFileName); if(eKind == CPicObject::eJpg) { CPicJpg pic(dib); //tmpフォルダに一時的に作成 bStatus = pic.Write(szFileName); }

  • ウィンドウに表示されないのはなぜ?

    ウィンドウの右クリックで、 ファイル名を読み込み、ウィンドウ上に表示させたいのですが、 うまくいかないです。どうしてでしょう。 ちなみに、タイトルバーには、表示されます。 宜しくお願い致します。 case WM_RBUTTONUP: if ( ofn.lStructSize == 0 ){ ofn.lStructSize = sizeof( OPENFILENAME ); ofn.hwndOwner = hWnd; ofn.lpstrFilter = TEXT("Text files {*.txt}\0*.txt\0") TEXT("HTML files {*.htm}\0*.htm;*.html\0") TEXT("All files {*.*}\0*.*\0\0"); ofn.lpstrCustomFilter = strCustom; ofn.nMaxCustFilter = sizeof( strCustom ); ofn.nFilterIndex = 0; ofn.lpstrFile = strFile; ofn.nMaxFile = sizeof( strFile ); ofn.Flags = OFN_FILEMUSTEXIST; } if ( GetOpenFileName(&ofn) ){ SelectObject( hdc, hFont ); SetBkColor( hdc, RGB(255,255,255) ); TextOut( hdc, 200, 410, strFile, lstrlen(strFile) ); SetWindowText( hWnd, strFile ); } else{ MessageBox( hWnd, TEXT("キャンセルされました。"), TEXT("確認"), MB_OK ); } return 0;

専門家に質問してみよう