• ベストアンサー

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

モードレスダイアログの作成方法として、以下のような記述を良く見かけます。 m_pDlg = new Choge2Dialog; m_pDlg->Create(IDD_DIALOG2, this); これを 変更1 m_pDlg = new Choge2Dialog(); 変更2 m_pDlg = new Choge2Dialog(this); このように変更しても問題無く作成されますが、これら3つの違いは何なのですか?

  • mk1234
  • お礼率94% (1832/1940)

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>m_pDlg = new Choge2Dialog; と >変更1 m_pDlg = new Choge2Dialog(); は、文法的に一緒です。 >変更2 m_pDlg = new Choge2Dialog(this); ヘルプを読みましょう。 http://www.microsoft.com/japan/developer/library/vcmfc/_mfc_cdialog.3a3a.cdialog.htm あと、ヘッダファイルを見ましょう。 コンストラクタの定義を見ればわかるかと思います。

mk1234
質問者

お礼

回答ありがとうございます。 分かりました。

関連するQ&A

  • モードレスダイアログを作るとき

    モードレスダイアログを作るとき、 dlg = new CInputDlg(this); 方法1  dlg->Create(IDD_DIALOG1); 方法2  dlg->Create(IDD_DIALOG1,this); どちらの方法でも作れるのですが、 CDialog::Create関数を調べると、引数のパターンが方法2なのに どうして方法1でも作れるのですか?

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

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

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

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

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

    開発環境 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つめのダイアログを終了してから、メニュバーから モードレスダイアログを表示しようとしても 同じエラーで異常終了します。 また、任意のモードレスダイアログを閉じたときに 何か気をつけることがあるでしょうか? 参考コードなどがありましたら ご教授ください。 よろしくお願いします。

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

  • Java インスタンス作成のイベント取得方法

    インスタンス化したことをイベントで取得することはできますか? 例) public class MyClass{ private MyDialog dialog = null; public void action(){ dialog = new MyDialog(); //ダイアログの中身の処理・・・(1) dialog.show(); } public MyDialog getDialog(){ return dialog; } } public class MyDialog extends JDialog{ (省略) } 前提 クラスMyClassの中身は変更することができない。 やりたいことは、MyClass#action()が呼ばれるたびに MyDialogにはってあるオブジェクトに命令を行いたい。 MyDialogのインスタンス作成イベントを取得できれば 上記を実現できると考えています。 以上です。

    • ベストアンサー
    • Java
  • [VC++] AfxBeginThreadで生成したスレッドの監視方法について

    お世話になります。 VC++でスレッドプログラムを作っています。 AfxBeginThreadでワーカースレッドを作成し、その中でダイアログを表示する プログラムです。 問題は、ワーカースレッドがある処理状態に至ったことを メインスレッドで検知したいのですが、それがうまく いかないということです。 コードの概略をしめします。 <メインスレッド側> void CTestApp::OnTest() {   CTestDlg dlg;   dlg.IsContinue = FALSE;   pThread = AfxBeginThread(TestDlg::Thread, (void*)&dlg);   while (!dlg.IsContinue) { // <----問題:このループ処理を抜けれない!    Sleep(0);   } } <ワーカースレッド側> UINT TestDlg::Thread(LPVOID pParam){   TestDlg* pDlg = (TestDlg*)pParam;   pDlg->Create(TestDlg::IDD);   pDlg->ShowWindow(SW_SHOW);     pDlg->IsContinue = TRUE; //<--ここでフラグを変更しているのに。   while(pDlg->IsContinue) {    MSG msg;    if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {      ::TranslateMessage(&msg);      ::DispatchMessage(&msg);    }   }   pDlg->DestroyWindow();   return 0; } ---- メインスレッドのSleep(0)で待つのを AfxGetApp()->PumpMessage()に変更すると ループを抜けるようなのですが、どうも納得できません。 上記のプログラムで問題、もしくはプロジェクトの 設定等に不備がある可能性がありましたら 御教授いただけたら幸いです。 よろしくおねがいいたします。

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

  • チャイルドダイアログボックスでマウスクリックが効かない

    チャイルドウィンドウタイプのモードレスダイアログを表示すると  マウスでエディットボックス(など)をクリックしてもフォーカスが移動しない という現象がおきています。(tabキーではOK) 数年前に一度作ったときの記憶を頼りに作っているのですが、下記以外に設定などが必要になるのでしょうか? …というか、このやり方で問題ないのでしょうか?… ◎環境 WindowsXP Visual C++ 6.0 & MFC アプリケーションの種類…SDI ◎やったこと 1.ダイアログリソースを追加 リソースのプロパティ  「一般」タブ   ID…「IDD_DIALOGA」  「スタイル」タブ   スタイル…チャイルド   境界線…ダイアログ枠   その他…すべてoff  「その他のスタイル」タブ   可視のみon  「拡張スタイル」、「その他の拡張スタイル」タブ   すべてoff  このダイアログにいくつかのボタンやエディットボックスを配置 2.親windowのヘッダファイルに追加したもの private: dialogA *pDlg; 3.親windowのソースファイルに追加したもの BOOL CModlessDialogApp::InitInstance() にコードを追加 …… // フレームをリソースからロードして作成します pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL); //↓↓ここから追加↓↓ pDlg = NULL; pDlg = new dialogA(); if(pDlg) { pDlg->Create(IDD_DIALOGA); pDlg->ShowWindow(SW_SHOWNA /*SW_SHOW|SW_RESTORE*/); } //↑↑ここまで追加↑↑ // メイン ウィンドウが初期化されたので、表示と更新を行います。 pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); …… スタイルを「オーバーラップ」「ポップアップ」にするとマウスクリックでフォーカスが移動します。

  • MFC VC++6.0 DestroyWindowの実装場所について

    [開発環境]:Visual C++ 6.0 現在、Visual C++ 6.0を使ったプログラミングの勉強をしています。 MFC AppWizard (exe)でSDIプログラムのtest1プロジェクト作成後、メインフレームにボタンを実装し、そのボタンを押下するとモードレスダイアログを表示するというアプリケーションを作っているのですが、ダイアログを終了させる時のDestroyWindowの実装場所と実装方法が分かりません。 ダイアログ用のクラスはCmyDialogとしていますが、ダイアログの終了ボタンを実装した場合、そのボタン処理の中すなわちCmyDialogクラスのなかの関数で行うべきなのでしょうか?それともダイアログの作成と同様にメインフレームがわの処理(CTest1Viewクラスでの処理?)として行うべきなのでしょうか?この場合にはどのような場所でどのようなタイミングで実装すればよいのか分かりません。 ご存じの方、これらについて御教授お願いします。 以下プログラムの一部を記載します。 -test1view.cppの一部-(ここでダイアログの作成と表示をしています) void CTest1View::OnButton1() { CmyDialog* myDLG = new CmyDialog; myDLG->Create(IDD_DIALOG1,this); myDLG->ShowWindow(SW_SHOW); }

専門家に質問してみよう