hiroといいます。初心者ですがよろしくお願いします。
MFCでダイアログのボタンを押したら、プロパティページが新しく表示されるものをつくっています。
最初のダイアログのコンボボックスの中にある文字列全てを次のプロパティページのコンボボックスに
コピーしたいのですが、うまくいきません。
やりたいことは
・GetCountでダイアログのコンボボックスの項目数を調べる
・プロパティシートのコンボボックスにコピーする
・DoModal()でプロパティシートを呼び出す。
といったことなのですがうまくいきません。どうか教えてください。
それと、メンバ変数以外の変数や文字列、配列などををDoModal()で他のページへ送るのはどうすれば
よいのですか?
//こんな感じのものを作って動きませんでした。
//最初のダイアログ
cnt = m_combo1.GetCount();
sheet1.combo2.ResetContent(); // プロパティシートのコンボボックス全項目削除
for (i=0; i<cnt ; i++)
{
sheet1.m_comb2.InsertString(-1,m_combo1[i]); // combo設定
}
ret = sheet1.DoModal(); // プロパティシートを呼ぶ
DoModalする前にはコンボボックスは作成されていないのでInsertStringすることはできません。
ASSERTが出てるんじゃないでしょうか?
sheet1のメンバ変数にコンボボックスのポインタを宣言しておいて、m_combo1のポインタを渡す。
で、sheet1のOnInitDialogでInsertStringすればいいと思います。
もしくはsheet1のOnInitDialogでGetParentすれば親ダイアログのポインタは取得できるので
m_combo1にアクセスできます。
Cdsさんありがとうございます。
まだよくわからないので教えていただけませんか?
>もしくはsheet1のOnInitDialogでGetParentすれば親ダイアログのポインタは取得できるので
>m_combo1にアクセスできます。
[親ウィンドウ]-[プロパティーシート]-[プロパティーページ]
で[プロパティーページ]のOnInitDialog()で次のようにしたいのですが、
m_combo1にアクセスできません(方法がわかりません)。ご指導お願いします。
//[プロパティーページ]のOnInitDialog()。このようなイメージ・・・にしたい。
CWnd* OyaWnd = GetParent(); // 親ウィンドウのポインタを取得
CComboBox* pOyaCB1=(CComboBox*)GetDlgItem(IDC_COMBO1); //?親画面のコンボ?
cnt = m_combo1.GetCount(); //?親画面のコンボの項目数?
int i;
CComboBox* pCB1=(CComboBox*)GetDlgItem(IDC_COMBO2); //[プロパティーページ]のコンボ
pCB1->ResetContent(); // コンボボックス全項目削除
for (i=0; i<cnt ; i++)
{
pCB1->InsertString(-1,pOyaCB1[i]); // コンボボックス設定
}
CComboBox *pCombo1 = (CComboBox *)(GetParent()->GetDlgItem(IDC_COMBO1));
です。
親子関係はきちんと理解してください。
Spy++などで確認してみてください。
Cdsさんありがとうございます。
実は上記のことまでは調べてわかったのですが、GetCount()のところで、エラーがでて
悩んでおります。今調べていたのですがわかりません。これはどうしたらよいのでしょうか?
//エラー
ハンドルされていない例外はXXX.exeにあります・・・
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0); }
それに、最後のInsertStringの第2引数をいろいろ試してみたのですがダメです。
この場合どうかけばいいのでしょうか?
//コード
CWnd* OyaWnd = GetParent(); // 親ウィンドウのポインタを取得
CComboBox *pOyaCB1=(CComboBox*)OyaWnd->GetDlgItem(IDC_COMBO1);
cnt = pOyaCB1->GetCount(); // 親ウィンドウのコンボボックスの項目数取得
CComboBox* pCB1=(CComboBox*)GetDlgItem(IDC_COMBO2); // 子ウィンドウのコンボ
pCB1->ResetContent(); // コンボボックス全項目削除
for (i=0; i<cnt ; i++)
{
pCB1->InsertString(-1, , ) //?????
}
IDC_COMBO1って本当に親にありますか?
pOyaCB1がヌルポインタになっているのでASSERTが出ています。
デバッガで調べましょう。
親の親ではないはずですが。
とにかくSpy++で親子関係を調べてください。
>それに、最後のInsertStringの第2引数をいろいろ試してみたのですがダメです。
>この場合どうかけばいいのでしょうか?
だめと言われても...。
普通に文字列を入れればいいだけですけど。
とりあえずAddStringでもいいのではないでしょうか。