MFC VC++6.0 XP
ダイアログにリストボックスを貼り付けて、そのリストボックスに表示される内容をそ
とから、コントロールしたいのですが、実態化したあと、InsertString()を使うと落ち
てしまいます。OnInitDailog()で、InsertString()を記述するとうまくいくのですが、
それでは、外から、リストの表示内容を渡すことができません。
詳しい方いらっしゃいましたら、よろしくお願いします。
// DialogList.h
CListBox m_ListBox ;
// DialogList.cpp
int CDialogList::InsertString( int nIndex, LPCTSTR lpszItem )
{
return(m_ListBox.InsertString(nIndex,lpszItem)) ;
}
//呼び出す側
CDialogList wDialogList ;
wDialogList.InsertString(0,0行目) ;//この行で落ちる
wDialogList.InsertString(1,1行目) ;
wDialogList.InsertString(2,2行目) ;
wDialogList.InsertString(3,3行目) ;
if (wDialogList.DoModal() == IDOK) {
}
これは仕様なので、「できない」が当然の動作。
MFC の FAQ に書かれているので読むべし。
http://msdn.microsoft.com/ja-jp/library/cc403767(VS.71).aspx
解決策も書いてある
tetrapod さん、レスありがとうございます。FAQで該当するところは、以下のところだ
と思います。
DoModal()が呼び出されるまで、ダイアログは、生成されないのですね。
不思議な感じがしますが、仕方ないですね。
CDialogコントロールのDDX/DDVが初期化できないわけは?
ダイアログが生成されるまで、つまりDoModal()が実行されるまでは、ダイアログのコン
トロールに対して何も行えません。問題の解決法として、データ用のメンバ変数を作成
し、それらをDoModalの呼び出しの前に初期化して、その後OnInitDialogまたは
UpdateData()で値を渡すという手段があります。ClassWizardで行うメンバ変数の初期化
とほとんど同じです。
したがって、ダイアログにCStringListかCStringArrayを組み込み、そこにリストボック
ス用の値を入れ、それらをOnInitDialog(など)にあるリストボックスに渡します。
ダイアログはウィンドウなので、
「実体を生成」と「ウィンドウを生成」は別です。
たとえば、
CWnd *wnd;
wnd=new CWnd;
wnd->Create(...);
wnd->ShowWindow(..);
変数宣言は上2つまで
DoModal()は、下の2つを担当すると考えればわかるのではないでしょうか
また、ウィンドウやコントロールのスタイルなどの設定はCreate時に行います
よって、Createされる前にコントロールをいじれないのは至極当然
ちなみに、InsertStringを、F11キーなどでステップインすると
いきなり「SendMessage」が使われているのがわかります。
当然、ウィンドウがない相手にはできないわけです
ryoさん、レスありがとうございます。
>「実体を生成」と「ウィンドウを生成」は別
なるほど、いい勉強になります。
> ちなみに、InsertStringを、F11キーなどでステップインすると
> いきなり「SendMessage」が使われているのがわかります。
わたしのイメージとは、ぜんぜん違いました。
重ねてありがとうございました。