![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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 此処まで
//
遅くなって申し訳ありません.
ご回答いただきましたが,なにやら面倒なので
このようにすることにしました.
>クラスAのコンストラクタに子ダイアログのポインタを渡しておくのが現実的です。
いろんなやり方がありますが,
どの方法でやるのがいいのかが難しいですね.
このたびはどうもありがとうございました.
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);
}
ありがとうございます.
すいません,書き忘れてました.ダイアログベースです.
で,下記のサンプルで試してみました.
>CWnd* pWnd = ::AfxGetMainWnd();
>CButton* pButton = static_cast<CButton*>(pWnd->GetDlgItem(IDC_CHECK1));
>const int nChecked = pButton->GetCheck();
けどすいません,これも書き忘れてましたが
ダイアログクラスというのはメインではなく
子ダイアログのクラスです.
例えば
・親(メイン)ダイアログクラス
・子ダイアログクラス
・Aクラス
があったとして,
子ダイアログクラスからAクラスの関数を呼び出して使用しています.
それでAクラスの関数の中で子ダイアログクラスのチェックボックスを調べたいのです.
説明してくださったのと同じような方法で
子ダイアログクラスのポインタを取得するといった方法はないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Excel(エクセル) vba sendKeysを送る相手のソフトを前面に開くには 1 2023/07/20 16:42
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「名前(first name) 1 2023/06/24 13:03
- Excel(エクセル) 別シートに毎回異なるデータをコピーする 7 2022/06/24 09:02
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
- HTML・CSS HTMLのdlとul どちらが正しいと思いますか 3 2023/02/23 11:20
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「A,B組の女子の氏名のよみ。 1 2023/05/16 15:28
- C言語・C++・C# 【C++】IDirect3DSurfaceのディープコピーは可能ですか? 1 2022/07/06 02:47
このQ&Aを見た人はこんなQ&Aも見ています
-
賃貸で可能な古民家風レトロな部屋作りのコツ!改めて知る畳の高い機能性と魅力も紹介
畳の部屋を雰囲気のよい部屋に仕上げたい!賃貸住宅でもできる古民家風のレトロな部屋作りのコツを伺った。
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
MFC ダイアログ上のID取得について
C言語・C++・C#
-
エディットボックスの入力制限について
C言語・C++・C#
-
-
4
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
5
ダイアログ間のデータ渡し
C言語・C++・C#
-
6
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
7
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
8
VC++にてボタン等のサイズ取得
C言語・C++・C#
-
9
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
10
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
11
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
12
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
13
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
14
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
15
VC++で文字列から任意の文字を削除するにはどうしたらいいですか?
C言語・C++・C#
-
16
MFC、ダイアログベースでのモードレス作成
C言語・C++・C#
-
17
CString型の文字列連結について
C言語・C++・C#
-
18
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
19
CStringの中から数字だけの場合と、その他が含まれる場合を識別する方法
C言語・C++・C#
-
20
「fatal error C1189」を回避するには?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FriendとPublicの違い。。。
-
エディットコントロールのイベ...
-
コンソールアプリでのクリップ...
-
(UWSC) 「#32770」の意味わかり...
-
ダイアログ表示時にチェックボ...
-
既定のコンストラクタがない?
-
クラスのアドレスを引数として...
-
MFCのCListCtrlでスクロールを検出
-
【C++】vectorについて
-
MessageBoxを継承したい
-
VC++ MFC CFrameWndって・・・
-
C#で定数クラスをシングルトン...
-
DataGridViewのセルに斜線を引...
-
リストコントロールをウィンド...
-
MFCでSDIからダイアログの呼び出し
-
Delphi2007のCheckBox.Font.Col...
-
WindowsAPIのリストビューの...
-
エディットコントロールでEnter...
-
WebBrowserコントロールを継承...
-
イベントにAddHandlerされてい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
ダイアログ表示時にチェックボ...
-
クラスのアドレスを引数として...
-
C++ protectedにアクセス不可
-
【ASP.NET】 独自で作成したク...
-
MFCアプリのコマンドラインでパ...
-
ダイアログクラスのコントロー...
-
エディットコントロールでEnter...
-
このコンパイルエラーの意味に...
-
CMainFrameクラスの使い方
-
イベントにAddHandlerされてい...
-
MFC モードレスDlgについて
-
MFCのCListCtrlでスクロールを検出
-
privateなメンバ関数をテストす...
-
[MFC] CWnd::MessageBoxの警告...
-
継承を重ねた場合のコストはど...
-
DataGridViewのセルに斜線を引...
-
ボタンのオーナードローについて
おすすめ情報