
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も見ています
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
コンボボックス表示文字列を取得する場合
C言語・C++・C#
-
6
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
7
ラジオボタンのグループ化
C言語・C++・C#
-
8
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
9
MFC ダイアログ上のID取得について
C言語・C++・C#
-
10
リストビューの選択状態を取得するメッセージはありますか?
C言語・C++・C#
-
11
ダイアログの上のテキストボックスの、初期値を設定する方法が分かりません・・・・
C言語・C++・C#
-
12
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
13
コンボボックスの高さを変更したい。
C言語・C++・C#
-
14
ラジオボタンの値の取得について(C++)
C言語・C++・C#
-
15
VC++で文字列から任意の文字を削除するにはどうしたらいいですか?
C言語・C++・C#
-
16
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
17
ダイアログ間のデータ渡し
C言語・C++・C#
-
18
GetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・
C言語・C++・C#
-
19
ビットマップ(bmp)形式で背景を透過にできる?
画像編集・動画編集・音楽編集
-
20
エディットボックスのフォントを変えたい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETでクラスライブラリプロ...
-
C++勉強中なんですが
-
VBA チェックボックスをオーバ...
-
VisualStudio2005
-
型InternetExplorerが未定義エ...
-
一クラス何ステップ以上で読む...
-
VC++ Express m_hWnd
-
プロトタイプなのにexternを使...
-
Delphi2007のCheckBox.Font.Col...
-
C#で、動的にサブクラスを取得...
-
クラス内の構造体の実体化とア...
-
templateのmap処理でエラー
-
クラスの作成方法を教えてください
-
C++のクラスのメンバになるクラ...
-
VBのシステムの設計書にUMLは適...
-
C# 別プロジェクトのフォームを...
-
コンソールアプリでのクリップ...
-
DLLの作り方および使い方について
-
VB6では、Applicationは未定義...
-
Objective-c 画像処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
(UWSC) 「#32770」の意味わかり...
-
ボタンのオーナードローについて
-
MFCアプリのコマンドラインでパ...
-
ダイアログ表示時にチェックボ...
-
【ASP.NET】 独自で作成したク...
-
エディットコントロールでEnter...
-
MFCのドラッグ&ドロップについて
-
オーバーライド関数の呼び出し...
-
DataGridViewのセルに斜線を引...
-
MFCのCListCtrlでスクロールを検出
-
C++ protectedにアクセス不可
-
ダイアログクラスのコントロー...
-
クラスのアドレスを引数として...
-
エディットコントロールのイベ...
-
個々の関数について継承してい...
-
WindowsAPIのリストビューの...
おすすめ情報