• ベストアンサー

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

こんにちは. 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