子ウインドウのチェックボックス リターンズ – プログラミング – Home

子ウインドウのチェックボックス リター...
 
通知
すべてクリア

[解決済] 子ウインドウのチェックボックス リターンズ


Kon
 Kon
(@Kon)
ゲスト
結合: 19年前
投稿: 89
Topic starter  

こんにちは。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はどうしてやれば良いのでしょう?

よろしくお願いします。


引用未解決
トピックタグ
Kon
 Kon
(@Kon)
ゲスト
結合: 19年前
投稿: 89
Topic starter  

すみません。誤記が有りました。

HWND* koDlg = (HWND*)GetDlgItem(IDD_KO);
CButton* check = (CButton*)GetDlgItem(koDlg, IDC_CHECK_1); //☆
set = check -> GetCheck();

です。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>HWND* oyaDlg = (HWND*)GetDlgItem(IDD_OYA);
間違っているようですが。

この場合のGetDlgItemは

CWnd* GetDlgItem( int nID ) const;

ですので、戻り値はHWND*ではありません。
よって無理やりキャストして動くわけもありません。

また GetDlgItem(IDD_OYA); で親ウィンドウが取得できるはずがないでしょう。
GetDlgItemはそのダイアログにある'子'ウィンドウを取得するものですから。

それと親から子ダイアログのチェックボックスを取得するのに
親のウィンドウハンドルを使うのはおかしいのでは?

まず、
> 子ウインドウ (IDD_KO)  基本クラス:CDialog
をどのように表示しているのか?

親ウィンドウからどのタイミングでチェックされているかの情報をとるのか
を明確にしてください。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

親wndが子dlgをDoModal()してるんならば、
子が親のメンバを見に行くんじゃなくて、
親がDoModal()に先立ってあらかじめ子に教えておけばいいんじゃないのん?
# モードレスだと話は変わってくるけども


返信引用
Kon
 Kon
(@Kon)
ゲスト
結合: 19年前
投稿: 89
Topic starter  

親ウインドウ (IDD_OYA) 基本クラス:CFormView クラス名:oyaForm
子ウインドウ (IDD_KO)  基本クラス:CDialog クラス名:koDialog
子ウインドウは、親ウインドウのタブコントロールの子画面になっています。

OnInitialUpdate で
 koDlog = new koDialog;
 koDlog -> Create(IDD_KO, (CWnd*)&m_tab);
 koDlog -> ShowWindow(SW_SHOW);
としています。

>それと親から子ダイアログのチェックボックスを取得するのに
>親のウィンドウハンドルを使うのはおかしいのでは?
そうですね。誤記でした。すみません。

チェックボックス1にチェックした直後、
親のリソースに飛んで、値を使いたいです。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>親ウィンドウからどのタイミングでチェックされているかの情報をとるのか
>を明確にしてください。
に対する回答がないですが、、、

>koDlog
は親Viewのメンバ変数にしてしまえば簡単に出来そうですけど。

CButton* pCheck = m_koDlog->GetDlgItem(IDC_CHECK_1);
int set = pCheck->GetCheck();


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

あ、
>チェックボックス1にチェックした直後、
>親のリソースに飛んで、値を使いたいです。
とありましたね。

チェックボックスのイベントかなにかで親のメソッドを読んだりしているのでしょう
か?


返信引用
Kon
 Kon
(@Kon)
ゲスト
結合: 19年前
投稿: 89
Topic starter  

>チェックボックスのイベントかなにかで親のメソッドを読んで

すみません。専門用語について行けませんでした。
メソッドを読むというのは、関数を呼ぶということと同意ですか?
チェックボックスのハンドラ関数から、親の関数を呼んでいます。

>親Viewのメンバ変数にしてしまえば

これは、クラスそのものを、メンバにしてしまうんですよね?
方法が分からないので、教えて頂きたいのですが、
右クリック”メンバ変数の追加”とすると、変数のタイプをきかれます。
クラスのメンバ変数だから、CDialog かな?

だめだ、サッパリ分かりません。

それから、
  koDlog = new koDialog
の記述はどうなりますか?


返信引用
+
 +
(@ )
ゲスト
結合: 17年前
投稿: 50
 

>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) ) ;


返信引用
Kon
 Kon
(@Kon)
ゲスト
結合: 19年前
投稿: 89
Topic starter  

+さんありがとうございます。試してみました。

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 *' に変換
することはできません。

となりました。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

なんかこっちもぐだぐだになって来たみたい。

> チェックボックスのハンドラ関数から、親の関数を呼んでいます。
ならば、親でチェックボックスの状態を知る必要はないのでは。
そこで状態を取り出した、親の関数に渡してあげればいいだけ。

親の関数がチェックボックスのハンドラ関数とは無関係にチェックボックスの
状態を知りたいのならば、Blueさんが書いている通り、
> CButton* pCheck = m_koDlog->GetDlgItem(IDC_CHECK_1);
> int set = pCheck->GetCheck();
で取り出せます。

> これは、クラスそのものを、メンバにしてしまうんですよね?
クラスそのものではなくクラスへのポインタです。

> クラスのメンバ変数だから、CDialog かな?
koDialog*

> それから、
>   koDlog = new koDialog
> の記述はどうなりますか?
  m_koDlog = new koDialog


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

ついでに CWnd* GetDlgItem(int nID) const; はウィンドウ内に配置された
コントロールのIDを使ってウィンドウハンドルを取得するものなので、
> HWND oyaDlg = (HWND)GetDlgItem(IDD_OYA);
> HWND koDlg = (HWND)GetDlgItem(IDD_KO);
はどちらもハンドルを取得できないと思いますが...


返信引用
Kon
 Kon
(@Kon)
ゲスト
結合: 19年前
投稿: 89
Topic starter  

みなさん、どうもありがとうございました。

koDialog* m_koDlog

CButton* pCheck = m_koDlog->GetDlgItem(IDC_CHECK_1);
int set = pCheck->GetCheck();

でめでたくコンパイルが通りました。
嬉しいです。o(^o^)/


返信引用
Kon
 Kon
(@Kon)
ゲスト
結合: 19年前
投稿: 89
Topic starter  

申し訳ありません。誤記が有りました。

koDialog* m_koDlog

CButton* pCheck = (CButton*)m_koDlog->GetDlgItem(IDC_CHECK_1);
int set = pCheck->GetCheck();

です。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました