• 締切済み

複数のモードレスダイアログを表示したい

開発環境 Windows XP Visual C++6.0 親ウインドウの、メニューから複数のモードレスダイアログを 表示しようとしています。 <ソースの抜粋> void CSmp1View::OnDialog1() { static Modaless aaa; static tagRECT bbb; aaa.Create(NULL,"Moderess",NULL, bbb ,this,IDD_DIALOG1,NULL); aaa.ShowWindow(SW_SHOW); } モードレスダイアログは、表示できるのですが 2つ目のダイアログを表示しようとすると 異常終了します。 また、1つめのダイアログを終了してから、メニュバーから モードレスダイアログを表示しようとしても 同じエラーで異常終了します。 また、任意のモードレスダイアログを閉じたときに 何か気をつけることがあるでしょうか? 参考コードなどがありましたら ご教授ください。 よろしくお願いします。

みんなの回答

  • keibou21
  • ベストアンサー率31% (18/58)
回答No.1

検証していないので不確かですが、 静的変数にしているのが問題ではないでしょうか。 一度Modalessをメンバ変数にポインタとして持って CSmp1View::OnDialog1()内で動的生成されてみてはいかがでしょうか? #aaa.Create()が2回呼ばれる所で落ちてそうな気がしたので

viva20000402
質問者

お礼

御礼が遅くなり、申し訳ありません。 「動的に」をヒントにコーディングしたところうまくいきました。 また、ダイアログを閉じるところでDestroyWindow()をコールして ダイアログの情報をフリーすることで、1回閉じて、もう1回ダイアログ表示で異常終了することを回避できました。

関連するQ&A

  • モードレスダイアログの作成について

    void CModelessDlg::OnButton1() { if( m_pTest == NULL) { m_pTest = new CTestDlg; m_pTest->Create(IDD_DIALOG1,this);//エラーが出る m_pTest->Create(this);//エラー無し } ・ ・ 一般的に上記のようなモードレスダイアログのサンプルコードの場合、Createの引数が2つ有る例がほとんどだと思うのですが、私がコンパイルすると引数が1つでないとエラーがでます。 どうしてなのか思い当たるふしがあれば、アドバイス頂きたいのですが。。。

  • モードレスダイアログをクリックして親を表示したくない

    初めまして。 VC++ win32で開発をしていますが、 モードレスダイアログをCreateDialogで作成し、ShowWindow(TRUE)で表示後、 他のアプリケーションを別プロセスで使用しているときにTOPMOSTで表示している上記ダイアログをクリックすると、親のウィンドウが表示されてしまいます。 これを抑止することはできないのでしょうか。 C#.NETだとできるようなのですが。 よろしくお願いいたします。

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

    環境 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); }

  • モードレスダイアログの作成方法

    以下のようにダイアログを作る場合、    dlg = new CMyDlg(this); ・・・1    dlg->Create(IDD_DIALOG1,this); ・・・2 それぞれのコードでthisを渡していますが、1で渡すthisと2で渡すthisは生成されるダイアログにどう影響をあたえるのですか? 両方とも親のウインドウを指示してると思うのですが、2回も指示するのはおかしいと思います。 また、1で何を与えようが、2でまた与えたら2が優先されて1で与えた意味が無い気がします。

  • MFC、ダイアログベースでのモードレス作成

    現在、MFCで検索プログラムを作成しています。 始めはDoModalで作成していたのですが、ダイアログを閉じずに、ダイアログを複数並べて見たいという意見が出た為、モードレスで作成し直そうとしたところ、ダイアログが現れてくれません。 インターネットで見つけたソースを試してみたのですが、上手くいきません。 どなたか教えて頂けますか? =ダイアログに移るボタンコードに= CDlg1 dlg; dlg.Create(IDD_DIALOG1, this); dlg.ShowWindow(SW_SHOW); (dlg.DestroyWindow();は他に記述) 1. 上記では、ShowWindowに0が返ってしまい、一瞬ダイアログが映って 消えてしまいます。Createは1が返ってるのでいいかと思いますが…。 2. あと、違うソースで試したところ、ダイアログは表示できるものの、 一回消してしまうと、もう一度ボタンを押しても再度は表示されません。 しかも、Destroy()を設定したOKボタンでは強制終了となってしまいます。 モードレスで作成すると、一回そのダイアログを消してしまうと再度表示ができないのでしょうか? モードレスってただ他の処理ができるというだけで、そのダイアログを何枚も表示させておくことはできないのでしょうか? 3. このダイアログにjpegファイルを表示させているのですが、ダイアログベース・htmlView以外で表示させれる方法がありましたら教えて下さい。 よろしくお願いします。

  • OnDestroy() について

    環境 WIN98 VC++6.0 MFC SDIにて アプリ起動と同時にダイアログを表示しています。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; } <質問1> このような場合に、CInputクラスに以下のようにOnDestroy()を追加しましたが、 ダイアログを閉じた時もアプリ終了時にもメッセージが飛んできません。 どうしてなのですか? void CInput::OnDestroy() { CDialog::OnDestroy(); AfxMessageBox("789"); } <質問2> 更に、以下のように新規にダイアログバーを追加したところ、メッセージが飛ぶようになりました。 どうしてなのでしょうか? int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 if (!m_wndMyDialogBar.Create(this, CG_IDD_MYDIALOGBAR, WS_VISIBLE , CG_ID_VIEW_MYDIALOGBAR)) { TRACE0("Failed to create dialog bar m_wndMyDialogBar\n"); return -1; // 作成に失敗 } dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; }

  • モードレスダイアログ

    お世話になっております。 VC2005を使用しております。 メインウィンドウの他にモードレスダイアログを常時表示させたいと 考えております。 ダイアログのプロパティのTopmostをTrueにすると常時手前に表示されるのですが、メインウィンドウを最小化したり、他のプログラムを起動した時も常に前面に表示されてしまいます。 メインウィンドウと同じように動作するにはどうすればよいのでしょうか?教えてください。 よろしくお願いします。

  • 複数のModelessDialogの終了

    メインダイアログと複数のモードレスダイアログがあるアプリがあります。 そのうちの一つのモードレスダイアログに終了ボタンがあり、ボタンが押されるとメインダイアログにSendMessageにて通知して、メインダイアログからモードレスダイアログをDestroyWindowにて終了させ、各モードレスダイアログの変数にNULLをセットするのですが、その後終了ボタン処理に戻ってしまい、Access Violationとなってしまいます。 普通こういう構成のアプリケーションの場合、どういった手段を用いるのが妥当でしょうか。 例えばSendMessageではなくPostMessageを使う等…。 「自分ならこうする」でも結構ですので教えて頂ければと思います。 環境:Windows7+VC9

  • 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(); } 宜しくお願いいたします。

  • WPFでのモーダル/モードレスダイアログの同時操作

    WPFでメインウインドウからモードレスダイアログとモーダルダイアログを表示し、 それぞれのダイアログに対して操作をしたいと思っています。 1.メインウインドウのボタンをクリックしてモードレスダイアログを表示 2.メインウインドウのボタンをクリックしてモーダルダイアログを表示 上記2の処理を行うと、上記1で表示したモードレスダイアログが一切操作を受け付けなく なるのですが、対応方法はありますでしょうか? 仕様上、片方のダイアログは必ずモーダル表示にします。 ソースコードは以下のような感じです。 private Window2 window2; private void button1_Click(object sender, RoutedEventArgs e) { window2 = new Window2(); window2.Show(); } private void button2_Click(object sender, RoutedEventArgs e) { Window window3 = new Window3(); window3.ShowDialog(); } よろしくお願いいたします。

専門家に質問してみよう