• ベストアンサー

ダイアログクラスのコントロールを別クラスで参照するには?

こんにちは. VS6.0 C++ MFCを使用してソフトを作成しています. 質問ですが, ダイアログクラスにチェックボックスを作成しました. それにチェックが入っているかいないかを 別のクラス(ダイアログクラス以外のクラス)から 調べる方法はないのでしょうか? できれば具体的なコードを示していただけるとありがたいです. よろしくお願いいたします.

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

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

 こんばんは。御礼頂きました。  残念ながらもストレートに子ダイアログのポインタを取り出す関数等は存在しません。  クラスAのコンストラクタに子ダイアログのポインタを渡しておくのが現実的です。  但し、EnumWindows()API等を利用して悪あがきをすれば、ある程度は可能です。以下参考程度に。 // //子ダイアログ.hpp 此処から // #if !defined(AFX_KODIALOG_H__5C45964E_1A4A_4B12_9040_60ACA0802FB7__INCLUDED_) #define AFX_KODIALOG_H__5C45964E_1A4A_4B12_9040_60ACA0802FB7__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // KoDialog.h : ヘッダー ファイル // //SetProp()/GetProp()APIで使用するキー const LPCTSTR TSTR_KEY = TEXT("find window id key"); //ウィンドウ列挙の結果を受け取る為 typedef struct { HWND hWnd; UINT uiID; } EWRESULT, *LPEWRESULT; //ウィンドウ列挙 inline BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { LPEWRESULT p = reinterpret_cast<LPEWRESULT>(lParam); p->hWnd = NULL; //キーから値を取り出す UINT uiID = reinterpret_cast<UINT>(::GetProp(hWnd, TSTR_KEY)); //一致しないので列挙を継続する if(p->uiID != uiID)return TRUE; //一致したので列挙を中断する p->hWnd = hWnd; return FALSE; } //指定されたダイアログIDからポインタを取り出す inline CWnd* AfxFindWindowFromID(UINT uiID) { EWRESULT result = {NULL, uiID}; ::EnumWindows(&::EnumWindowsProc, reinterpret_cast<LPARAM>(&result)); return result.hWnd ? CWnd::FromHandle(result.hWnd) : NULL; } //クラスA class A { public: A() { } ~A() { } void Method() { //ダイアログIDからポインタを探す CWnd* pWnd = ::AfxFindWindowFromID(IDD_KODIALOG); if(pWnd == NULL)return; //チェックボタンの確認 CButton* pButton = static_cast<CButton*>(pWnd->GetDlgItem(IDC_CHECK1)); const int nChecked = pButton->GetCheck(); } }; ///////////////////////////////////////////////////////////////////////////// // CKoDialog ダイアログ class CKoDialog : public CDialog { // コンストラクション public: CKoDialog(CWnd* pParent = NULL); // 標準のコンストラクタ // ダイアログ データ //{{AFX_DATA(CKoDialog) enum { IDD = IDD_KODIALOG }; // メモ: ClassWizard はこの位置にデータ メンバを追加します。 //}}AFX_DATA // オーバーライド // ClassWizard は仮想関数のオーバーライドを生成します。 //{{AFX_VIRTUAL(CKoDialog) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート //}}AFX_VIRTUAL // インプリメンテーション protected: A m_classA;//クラスA // 生成されたメッセージ マップ関数 //{{AFX_MSG(CKoDialog) virtual void OnOK(); virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。 #endif // !defined(AFX_KODIALOG_H__5C45964E_1A4A_4B12_9040_60ACA0802FB7__INCLUDED_) // //子ダイアログ.hpp 此処まで // // //子ダイアログ.cpp 此処から // BOOL CKoDialog::OnInitDialog() { CDialog::OnInitDialog(); // TODO: この位置に初期化の補足処理を追加してください //GetProp()APIで探し出せる様にする為、ダイアログIDを登録しておく ::SetProp(this->GetSafeHwnd(), TSTR_KEY, reinterpret_cast<HANDLE>(IDD_KODIALOG)); return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります // 例外: OCX プロパティ ページの戻り値は FALSE となります } // //子ダイアログ.cpp 此処まで //

komehon
質問者

お礼

遅くなって申し訳ありません. ご回答いただきましたが,なにやら面倒なので このようにすることにしました. >クラスAのコンストラクタに子ダイアログのポインタを渡しておくのが現実的です。 いろんなやり方がありますが, どの方法でやるのがいいのかが難しいですね. このたびはどうもありがとうございました.

その他の回答 (1)

回答No.1

 こんばんは。  ダイアログベースならば以下で出来ませんか。 //別のクラスから以下を実行 CWnd* pWnd = ::AfxGetMainWnd(); CButton* pButton = static_cast<CButton*>(pWnd->GetDlgItem(IDC_CHECK1)); const int nChecked = pButton->GetCheck();  ダイアログベースでなければ、呼び出したいクラスのコンストラクタにダイアログのポインタを挟み込むのが手っ取り早いのでは。 //ダイアログと関係ないクラス class CMyClass { public: explicit CMyClass(CWnd* pWnd = NULL) : m_pWnd(pWnd){ } ~CMyClass(){ } //遅延初期化や途中変更を受け付ける void Set(CWnd* pWnd){ m_pWnd = pWnd; } void Method() { if(m_pWnd == NULL)return; CButton* pButton = static_cast<CButton*>(m_pWnd->GetDlgItem(IDC_CHECK1)); const int nChecked = pButton->GetCheck(); } private: CWnd* m_pWnd; }; //ダイアログのコンストラクタから CMyDlg::CMyDlg() : m_myClass(this) { }  又は //ダイアログのメソッド内から BOOL CMyDlg::OnInitDialog() { CDialog::OnInitDialog(); m_myClass.Set(this); }

komehon
質問者

お礼

ありがとうございます. すいません,書き忘れてました.ダイアログベースです. で,下記のサンプルで試してみました. >CWnd* pWnd = ::AfxGetMainWnd(); >CButton* pButton = static_cast<CButton*>(pWnd->GetDlgItem(IDC_CHECK1)); >const int nChecked = pButton->GetCheck(); けどすいません,これも書き忘れてましたが ダイアログクラスというのはメインではなく 子ダイアログのクラスです. 例えば ・親(メイン)ダイアログクラス ・子ダイアログクラス ・Aクラス があったとして, 子ダイアログクラスからAクラスの関数を呼び出して使用しています. それでAクラスの関数の中で子ダイアログクラスのチェックボックスを調べたいのです. 説明してくださったのと同じような方法で 子ダイアログクラスのポインタを取得するといった方法はないのでしょうか?

関連するQ&A

  • 別スレッドからメインダイアログのコントロールにアクセスする方法

    VC++2005 MFC WindowsXPを使用しています。 メインダイアログに作成したエディットボックスに フォーカスをセットしたいのですが、 別スレッドから行うにはどのようにすればよいのでしょうか? メインダイアログにあるボタンを押すと別スレッドの処理に入り、 その中でメインダイアログのコントロールを操作しようとしています。 //フォーカスをセット CWnd* MyEdit = ( CWnd* )this->GetDlgItem( IDC_EDIT1 ); MyEdit->SetFocus(); 宜しくお願い致します。

  • 別のDLLのダイアログを・・・

    VC++.NETでMFCアプリを開発しています。 コマンド側から、別のDLLのダイアログをCreateし、ShowWindow()したところで例外が発生します。 コマンド側は通常のDLLで作成し、「staticライブラリでMFCを使用する」で使用し、 ダイアログ側は拡張DLLで作成し、「共有DLLでMFCを使用する」で使用しております。 Create()するところで、コマンドのポインタをダイアログに渡すと例外が発生します。 理由がわかりません。教えてくださいm(__)m 説明が足りなければ補足いたします。

  • ダイアログボックスのコメント

    いつもお世話になっております。 VS2005でC++を用いてWindowsアプリケーションの作成をしています。 ダイアログボックス内にラジオボタンが2つあり、 どちらかのラジオボタンにチェックを入れた時点で ダイアログ内の空いたスペースにコメント(スタティックテキスト?) を表示させたいと考えています。(ヘルプ的な感じ) このような場合、コメントとして使うのは 「スタティックテキスト」でいいのでしょうか。 またどのように表示・非表示の切り替え?をすればいいのでしょうか。 宜しければ方法を教えていただきたいです。 ご教授お願いいたします。

  • カレンダーコントロールのダイアログボックス

    ACCESSでボタンをクリックすると、カレンダーコントロールのダイアログボックスが表示されて、日付が入力出来るようにしたいのですが... この方法で日付を入力するテキストボックスに共通で使用出来たらと考えています。 カレンダーコントロールのダイアログボックスの作成から分からないのでお願いします。

  • ダイアログの丸ごとコピー

    VC++6.0でMFCのプロジェクトを作っています。Aのプロジェクトで作成したダイアログを別のBプロジェクトで丸ごと(リソースもクラスも)コピーして利用することはできますか。出来るなら方法を教えてください。

  • C言語によるダイアログ操作について

    ダイアログボックスを表示するときに C言語からサイズの指定をしたいのですが 出来ません C++ではなくて(MFCを使用しない) C言語のソースから指定する方法を 教えてください。急ぎです!!

  • API関数でリストボックスのコントロールを

    C(MFCを使用しない)でアプリを作ったのですが ダイアログボックス内のリストボックスで 表示させるデータが横幅より大きくなったら 水平スクロールを出したいのですがプロパティの 水平スクロールにチェックをつけても出ません!!! API関数を使って水平スクロールを出す方法を 教えてください。。至急。。どうぞよろしく お願いします。

  • C# クラスのインスタンスについて

    クラス(ClassA)を作成した後に別のクラス(ClassB)内でClassAインスタンスを作成したとします。 このインスタンスをさらに別のクラス(ClassC)で使用したいと思うの ですが可能なんでしょうか? 要するに1つのインスタンスを他で使いまわすような事ができないの かなって思っています。 自分で調べると「Singletonパターン」という方法があるようですが 他の方法もあれば知ってみたいと思っています。 ※環境はWinXP、VS2005 C# です。 以上ですが、よろしくお願いいたします。

  • ダイアログ作成での質問

      VS.NET2003のWin32APIで作成しています。 ダイアログボックを使用してデータ入力および作成ができるようにしたいと考えています。 そこで、リスト状になっていてクリックするとコンボボックスになるにはどうしたらいいでしょうか? リスト状に数値入力も可能なのでエディット関係かなと思っているのですが。   ネットで探しているのですが中々見つからないのでここで質問をさせていただきました。   画像を載せました、こういったダイアログにするにはどうしたらいいでしょうか?    

  • パワーポイント起動ダイアログを再度表示する方法

    パワーポイントの起動時に新しいプレゼンテーションの作成などのダイアログボックスがでますが、「今後、このメッセージを表示しない」のチェックボックスにチェックを入れた後、再度ダイアログボックスを表示することが出来るのでしょうか? 使用ソフト MS Office PowerPoint 2003

専門家に質問してみよう