• 締切済み

フォームの再表示について

VC++初心者です。 ダイアログベースのアプリケーションをつくったんですが、その後ボタンクリックでモーダルダイアログを2つ順番に表示したいと思っています。 void CMFC_testDlg::OnBnClickedButton1() {   CmyDialog myDL;   ret1 = myDL.DoModal(); } で一つ目を表示 void CmyDialog::OnBnClickedOk() {   this->ShowWindow(SW_HIDE);   CmyDialog02 myDL02;   myDL02.DoModal(); } で一つ目を隠して、2つ目を表示 さらに2つ目のダイアログのボタンを押した時、2つ目を閉じて1つ目を再表示したいと思います。 void CmyDialog02::OnBnClickedOk() {   EndDialog(-1);   CmyDialog::ShowWindow(SW_SHOW); } と書いた所エラーになります。 どこがまずいんでしょうか。 エラーメッセージ:静的でないメンバ関数の呼び出しが正しくありません VBになれてしまっているため、C++の文法でどう書いていいのかわかりません。 どなたかお教えください。

みんなの回答

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

エラーの直接の原因はShowWindowメソッドの呼び出し指定を「::」で行おうとしている点です。(なぜ「::」を使うとエラーになるのかを理解するには、C++言語の文法規約を学ぶ必要があります。) CmyDialog02::OnBnClickedOkの中でShowWindowを呼び出すかわりに、CmyDialog::OnBnClickedOkの中で(既に行っているのと同じ方法で)ShowWindowを呼び出すようにすればエラーにはなりません。

hibachi
質問者

お礼

ちょっと調べてみたんですが、VBと違って処理を細かく場合わけしてきちんとEndDialogを記述して..とする必要があるんですね。もう少し勉強してから質問することにします。ありがとうございました。

hibachi
質問者

補足

>(なぜ「::」を使うとエラーになるのかを理解するに > は、C++言語の文法規約を学ぶ必要があります。) はい、一通り文法の本を読んでおく必要はあるかもしれません。(^^; VBとかなり違いますね。 > CmyDialog::OnBnClickedOkの中で(既に行っている > のと同じ方法で)ShowWindowを呼び出すようにすれ > ばエラーにはなりません。 VB.netだと、いったん生成したフォームオブジェクトを参照することで、容易にフォームのClose、Showはできるんですが、VC++だと難しいですか? この場合だと、あえてCmyDialog02::OnBnClickedOkの中から一つ目のダイアログを操作したいのですが、どうすればいいんでしょうか。

関連するQ&A

  • ダイアログの表示、非表示の切り替えについて

    環境 WIN98 VC++6.0 MFC SDIにて 1.ポップアップメニューの”ダイアログ作成”をクリックすると、 void CMainFrame::OnKNew() { CInput dlg; int iID = dlg.DoModal(); } として、ダイアログを作成します。 2.次に、ダイアログのボタン押し下げにてダイアログを非表示にします。 void CInput::OnButton1() { ShowWindow(SW_HIDE); } このようなコードにおいて、非表示状態での”ダイアログ作成”クリックでは非表示から表示に切り替えることを実現するにはどのようにすれば良いのでしょうか? よろしくお願いいたします。

  • ダイアログのボタンが押された時に、その「ボタン」のあるダイアログと、すでに表示されている他のダイアログを消したいです

    Win2000/MFC/ダイアログベース で作業しています。初心者です(^^;) Aというダイアログで「あるボタンa」を押してDoModalでBというダイアログを表示させ、Bダイアログで「あるボタンb」を押してDoModalでCというダイアログを表示させ、Cダイアログで「あるボタンc」を押した時にBダイアログとCダイアログを閉じたい(消したい)のですが EndDialogで消せません DoModalの戻り値をret_b,ret_cとした場合 EndDialog(ret_c); EndDialog(ret_b); としたのですが。。。 やり方がおかしいのか、よくわかりません・・ 初心者でもわかりやすいお返事お待ちしています(^^;)

  • VC++でダイアログ表示について

    VC++初心者です。 MFCアプリケーションでダイアログベースのアプリケーションを作ったのですが、ボタンクリック時にもう一つダイアログを表示しようと思っています。 以下のコードだと、うまく表示されずに画面がフリーズしてしまいます。どこを直したらいいのでしょうか。ご教授願います。 環境は、xp、Visual Studio.net 2003です。 void CMFCtestDlg::OnBnClickedButton1() {   //   CmyDialog myDL;   myDL.DoModal(); } MFCtestDlg.cpp内、#include "myDialog.h" は記述してあります。 VBの経験はあるのですが、VC++はまったくわかりません。 よろしくお願いします。

  • 複数のダイアログの作成について

    環境 WIN98 VC++6.0 MFC SDIにて 1.メニューの”ダイアログ作成”をクリックすると、 void CMainFrame::OnKNew() { CInput dlg; int iID = dlg.DoModal(); } として、ダイアログを作成します。 2.次に、ダイアログのボタン押し下げにてダイアログを非表示にします。 void CInput::OnButton1() { ShowWindow(SW_HIDE); } このようなコードにおいて、一旦非表示にした後で、また”ダイアログ作成”メニューにてダイアログを作成した場合、 1.これは新たに2個目のダイアログが作られたのでしょうか? 2.それとも、単に最初に作られたダイアログが非表示から表示状態になっただけでしょうか? 3.それとも、最初のダイアログの上に2個目のダイアログが上書きされてしまうのでしょうか? 以上よろしくお願いします。

  • ダイアログの再表示について

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、 生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_left=100; pWnd->m_top=100; m_pAryDlg.Add ( pWnd ); //m_pAryDlg2.Add ( &m_InputData ); pWnd->m_moji=m_InputData; pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログが非表示から 表示になるように以下のコードを書きましたが、表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point)  //ウィンドウのダブルクリック { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

  • ダイアログの非表示が遅い

    ダイアログの非表示が遅い Windows CE上で動作するソフトを作成中で、約2cm×2cmほどのボタンだけのダイアログが1つ(メインのダイアログ)、約2cm×1cmほどのボタンだけのダイアログが3つあります。(ダイアログの大きさは、それぞれのボタンと同じサイズで、メイン以外はモーダレスです。) その中の1つを押すと、別の全画面サイズのダイアログを表示し、そのダイアログ上のボタンを押すと、元のボタンだけになるようにしています。 全て、メインのダイアログのOnInitDiarog()で生成しておき、ShowWindow(SW_SHOW)で表示し、ShowWindow(SW_HIDE)で非表示にしているのですが、全画面サイズのダイアログを非表示にする際、表示が消える前に、ボタンのダイアログが表示されてしまい、見た目がかなり悪いのです。 Windows CEは遅いと聞いた事はあるのですが、どうにか対処する方法はないのでしょうか? どなたか助言をお願い致します。 環境は以下の通りです。 ・Windows CE 5.0 ・Visual C++ 2005 ・MFCスマートデバイス 以上、よろしくお願いします。

  • SendMessage();の使い方

    よろしくお願いします。 <環境> WIN98 VC++6.0 MFC SDIにてウィンドウをクリックすると、モードレスダイアログ1とモーダルダイア ログ2が開くようにしました。 void CMy222View::OnLButtonDown(UINT nFlags, CPoint point) { CDlg1 *dlg; dlg = new CDlg1; dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); CDlg2 dlg2; dlg2.DoModal(); CView::OnLButtonDown(nFlags, point); } ダイアログ2のボタン押し下げにてダイアログ1のボタン1を押し下げたいのですが 、どのようにすれば実現できるのでしょうか? void CDlg2::OnButton2() { SendMessage(); //■ここの書き方が分かりません CDialog::OnOK(); } 宜しくお願いいたします。

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

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

  • 非表示のメインウィンドウを表示させるには?

    環境 WIN98 VC++6.0 MFC SDIにて タスクトレイに常駐するアプリにおいて 1.起動時にメインウィンドウを非表示にしています。 2.起動時と同時にダイアログを表示しています。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; } 3.このような場合に、ダイアログのボタン押し下げにて、メインウィンドウを表示させるには、どうすれば良いでしょうか? 以下のようにしてみましたが、不正な処理で落ちてしまいます。 void CInput::OnButton1() { CWnd* mywnd = (CWnd*)GetParent(); mywnd->ShowWindow(SW_SHOW); }

  • CColorDialogの拡張について

    始めまして。質問させて下さい。 VC++ 2005 MFCで開発しております。 CColorDialogのサブクラスを作成しています。 ダイアログ上にあるコントロールのVisibleを変更させようと思い、 サブクラスのOnInitDialogで CButton *pBtnOK = ( CButton* )GetDlgItem( IDOK ); CButton *pBtnCancel = ( CButton* )GetDlgItem( IDCANCEL ); if( pBtnOK != NULL ){ pBtnOK->ShowWindow( SW_HIDE ); } if( pBtnCancel != NULL ){ pBtnCancel->ShowWindow( SW_HIDE ); } としています。 「色の作成」ボタンのも同様の処理をしたいのですが、 コントロールIDがわからないため実装できません。 IDをご存じの方はいますでしょうか? また、別の方法等ございましたらご教授お願い致します。

専門家に質問してみよう