こんにちは。Konです。
度々すみませんが、またお願い致します。
PCはWinXP、MicrosoftVisualC++6.0 を使用しています。
MFC で、基本クラスをCFormView にしてプロジェクトを作りました。
親ウインドウ (IDD_OYA) 基本クラス:CFormView
子ウインドウ (IDD_KO) 基本クラス:CDialog
子ウインドウのチェックボックス1 (IDC_CHECK_1)
という構成になっています。
親のリソースから、チェックボックス1の値を取りたいのですが、
”ウインドウハンドル”がよく分からず、うまくいきません。
とりあえず、自分としては↓としたところ、
HWND* oyaDlg = (HWND*)GetDlgItem(IDD_OYA);
CButton* check = (CButton*)GetDlgItem(oyaDlg, IDC_CHECK_1); //☆
set = check -> GetCheck();
☆の行で1 番目の引数を 'struct HWND__ ** ' から 'int' に変換できません。
というエラーになります。
ヘルプを見ると、
HWND GetDlgItem(HWND hDlg, int nID);
CWnd::GetDlgItem( int nID, HWND* hDlg )
の両方使えるようなのですが、どちらを使うべきですか?
それから、nIDはIDC_CHECK_1で良いと思うのですが、
hDlgはどうしてやれば良いのでしょう?
よろしくお願いします。
すみません。誤記が有りました。
HWND* koDlg = (HWND*)GetDlgItem(IDD_KO);
CButton* check = (CButton*)GetDlgItem(koDlg, IDC_CHECK_1); //☆
set = check -> GetCheck();
です。
>HWND* oyaDlg = (HWND*)GetDlgItem(IDD_OYA);
間違っているようですが。
この場合のGetDlgItemは
CWnd* GetDlgItem( int nID ) const;
ですので、戻り値はHWND*ではありません。
よって無理やりキャストして動くわけもありません。
また GetDlgItem(IDD_OYA); で親ウィンドウが取得できるはずがないでしょう。
GetDlgItemはそのダイアログにある'子'ウィンドウを取得するものですから。
それと親から子ダイアログのチェックボックスを取得するのに
親のウィンドウハンドルを使うのはおかしいのでは?
まず、
> 子ウインドウ (IDD_KO) 基本クラス:CDialog
をどのように表示しているのか?
親ウィンドウからどのタイミングでチェックされているかの情報をとるのか
を明確にしてください。
親wndが子dlgをDoModal()してるんならば、
子が親のメンバを見に行くんじゃなくて、
親がDoModal()に先立ってあらかじめ子に教えておけばいいんじゃないのん?
# モードレスだと話は変わってくるけども
親ウインドウ (IDD_OYA) 基本クラス:CFormView クラス名:oyaForm
子ウインドウ (IDD_KO) 基本クラス:CDialog クラス名:koDialog
子ウインドウは、親ウインドウのタブコントロールの子画面になっています。
OnInitialUpdate で
koDlog = new koDialog;
koDlog -> Create(IDD_KO, (CWnd*)&m_tab);
koDlog -> ShowWindow(SW_SHOW);
としています。
>それと親から子ダイアログのチェックボックスを取得するのに
>親のウィンドウハンドルを使うのはおかしいのでは?
そうですね。誤記でした。すみません。
チェックボックス1にチェックした直後、
親のリソースに飛んで、値を使いたいです。
>親ウィンドウからどのタイミングでチェックされているかの情報をとるのか
>を明確にしてください。
に対する回答がないですが、、、
>koDlog
は親Viewのメンバ変数にしてしまえば簡単に出来そうですけど。
CButton* pCheck = m_koDlog->GetDlgItem(IDC_CHECK_1);
int set = pCheck->GetCheck();
あ、
>チェックボックス1にチェックした直後、
>親のリソースに飛んで、値を使いたいです。
とありましたね。
チェックボックスのイベントかなにかで親のメソッドを読んだりしているのでしょう
か?
>チェックボックスのイベントかなにかで親のメソッドを読んで
すみません。専門用語について行けませんでした。
メソッドを読むというのは、関数を呼ぶということと同意ですか?
チェックボックスのハンドラ関数から、親の関数を呼んでいます。
>親Viewのメンバ変数にしてしまえば
これは、クラスそのものを、メンバにしてしまうんですよね?
方法が分からないので、教えて頂きたいのですが、
右クリック”メンバ変数の追加”とすると、変数のタイプをきかれます。
クラスのメンバ変数だから、CDialog かな?
だめだ、サッパリ分かりません。
それから、
koDlog = new koDialog
の記述はどうなりますか?
>HWND* oyaDlg = (HWND*)GetDlgItem(IDD_OYA);
>CButton* check = (CButton*)GetDlgItem(oyaDlg, IDC_CHECK_1); //☆
CWndにはoperator HWND()があるので(HWND)GetDlgItem(IDD_OYA)でOKだったとか?
なのでこう直す?(エラー出てもしりませんw)
HWND oyaDlg = (HWND)GetDlgItem(IDD_OYA);
CButton* check = CButton::FromHandle( ::GetDlgItem(oyaDlg, IDC_CHECK_1) ) ;
+さんありがとうございます。試してみました。
HWND oyaDlg = (HWND)GetDlgItem(IDD_OYA);
CButton* check = CButton::FromHandle( ::GetDlgItem(oyaDlg, IDC_CHECK_1) ) ;
HWND koDlg = (HWND)GetDlgItem(IDD_KO);
CButton* check = CButton::FromHandle( ::GetDlgItem(koDlg, IDC_CHECK_1) ) ;
共に rror C2440: 'initializing' : 'class CWnd *' から 'class CButton *' に変換
することはできません。
となりました。
なんかこっちもぐだぐだになって来たみたい。
> チェックボックスのハンドラ関数から、親の関数を呼んでいます。
ならば、親でチェックボックスの状態を知る必要はないのでは。
そこで状態を取り出した、親の関数に渡してあげればいいだけ。
親の関数がチェックボックスのハンドラ関数とは無関係にチェックボックスの
状態を知りたいのならば、Blueさんが書いている通り、
> CButton* pCheck = m_koDlog->GetDlgItem(IDC_CHECK_1);
> int set = pCheck->GetCheck();
で取り出せます。
> これは、クラスそのものを、メンバにしてしまうんですよね?
クラスそのものではなくクラスへのポインタです。
> クラスのメンバ変数だから、CDialog かな?
koDialog*
> それから、
> koDlog = new koDialog
> の記述はどうなりますか?
m_koDlog = new koDialog
ついでに CWnd* GetDlgItem(int nID) const; はウィンドウ内に配置された
コントロールのIDを使ってウィンドウハンドルを取得するものなので、
> HWND oyaDlg = (HWND)GetDlgItem(IDD_OYA);
> HWND koDlg = (HWND)GetDlgItem(IDD_KO);
はどちらもハンドルを取得できないと思いますが...
みなさん、どうもありがとうございました。
koDialog* m_koDlog
CButton* pCheck = m_koDlog->GetDlgItem(IDC_CHECK_1);
int set = pCheck->GetCheck();
でめでたくコンパイルが通りました。
嬉しいです。o(^o^)/
申し訳ありません。誤記が有りました。
koDialog* m_koDlog
CButton* pCheck = (CButton*)m_koDlog->GetDlgItem(IDC_CHECK_1);
int set = pCheck->GetCheck();
です。