というわけで、結果は同じではなかったわけです。
では、
クラス AAAA から CXXXDlg のコントロール変数の list,m_text を操作したい。
では、 AAAA はどのようにメンバ変数+メソッドを組み込めばよいか?
// CXXXDlg.h
class CXXXDlg : public CDialog
{
・・・
public:
CComboBox m_list;
CEdit m_text;
・・・
protected:
・・・
afx_msg void OnButton1();
・・・
};
//--------------------------------------
// CXXXDlg.h
#include XXXDlg.h
#include AAAA.h
void CXXXDlg::OnButton1()
{
AAAA a;
// ここにはどのような記述が必要?
a.UpDate();
}
//--------------------------------------
// AAAA.h
#include XXXDlg.h
class AAAA
{
public:
// ここにはどんなメンバ変数が必要?
void UpDate()
{
// ここにはどのような記述を書くべき?
}
};
ちなみに、CXXXDlgのメンバ(親子関係でいうと子)であるCDropComboBoxには極力、
親に依存しないように実装すべきです。(今回はそんなことする必要はないですけど)
>nの値はm_iに代入してるだけで変化なし
上の式ではnに変化はないが
下の式ではn=11になります。
勘違いしてました。
>クラス AAAA から CXXXDlg のコントロール変数の list,m_text を操作したい。
>では、 AAAA はどのようにメンバ変数+メソッドを組み込めばよいか?
質問内容をもうちょっと詳しくお願いできますか?
>void CXXXDlg::OnButton1()
>{
> AAAA a;
>
> // ここにはどのような記述が必要?
>
> a.UpDate();
>}
普通は、AAAAには結果を返すようにつくればよいのですが、
void CXXXDlg::OnButton1()
{
AAAA a;
CString s1, s2;
// a で処理した結果を s1, s2 に格納
a.UpDate( s1, s2 );
m_text.SetWindowText( s1 );
m_list.AddString( s2 );
}
class AAAA
{
public:
void UpDate( CString& s1, CString& s2 )
{
s1 = 適当; s2 = 適当;
}
};
今までのやり取りから、ダイアログクラスを直接操作したいというのがあったので、
UpDateメソッドの引数を1ないし0にするにはどうしたらいいかというのが質問です。
・引数をとる場合は、UpDateメソッドの引数の型はなにか?
・引数をとらない場合、メンバ変数を使うが、メンバ変数の型はなにか?
一つ抑えておくべき事は、MFCのクラスであるCDialogからの派生クラスは、
あくまでも制御を行う為の実体であって実際のウインドウそのものではないという事です。
CDialogクラスはウインドウを制御する事ができますが、実際にはその制御には
内部で保持しているウインドウのハンドルを使ってWin32APIで制御しています。
(全てそうとは言いませんが、概念的にはそう考えて良いと思います)
CDialogクラスのインスタンスを作成しただけの状態(CXXXDlg dlg;とかしただけの時)では
まだ、クラス内に制御対象のウインドウのハンドルはありません。
実際にはDoModal等のウインドウを表示する為の動作をして始めてハンドルが設定されます。
ですから既に表示されているウインドウに対して制御を行う時にはそのウインドウを表示
した時に
使ったクラスのインスタンスである必要があります。
(実際には他にも方法がありますけれど、ここでは書きません。
上記の部分が理解できていないとかえって混乱すると思うので)
画面上のウインドウとクラスインスタンスは関連する物ではありますが、
同じ物ではありません。そこのところをきちんと認識しておく必要があると思います。
また、クラスが同じでもインスタンスが違えば、物としては別物になります。
例えば、
CXXXDlg a;
CXXXDlg b;
この場合、aもbもCXXXDlgクラスのインスタンスですが、
aとbはインスタンスとしても、ウインドウとしても別物と考えるべきです。