我用的是VS2008SP1,对话框m_Dlg,内含一个CcomboBox控件,控制变量为m_ComBoxCtrl,我用addstring向其中添加字符串,像这样
定义了一个对象m_Dlg
......
m_Dlg.m_ComBoxCtrl.addstring(L"aaaaa");
m_Dlg.m_ComBoxCtrl.addstring(L"bbbbbb");
m_Dlg.DoModal();
....
结果报错
但是如果实在m_Dlg的OnInitDialog()中添加
m_ComBoxCtrl.addstring(L"aaaaa");
m_ComBoxCtrl.addstring(L"bbbbbb");
运行正常
请问这是为什么呢?

解决方案 »

  1.   

    m_Dlg.DoModal();之前对话框还未进行初始化工作,控件也没初始化呢~
      

  2.   

    我觉得控件也没初始化这个说法不大对,因为比如我里面有checkbox,radiobox,都是可以在OnInitDialog()前正常初始化的。比如:
    m_Dlg.m_Test_Check = FALSE;
    m_Dlg.m_Test_Radio = 0;
    m_Dlg.DoModal(); 
    这样就是可以正常,再比如执行像m_Dlg.m_ComBoxCtrl.GetLBText()这样也是没问题的。
      

  3.   

    m_Dlg.m_Test_Check = FALSE; 
    m_Dlg.m_Test_Radio = 0; 
    定义的时简单数据类型变量当然没问题。
    m_ComBoxCtrl变量是复杂的控件型变量,需要涉及初始化和加载GDI资源,所以不一样的。
    GetLBText()是读取,对一个不存在的对象读取,返回空白就行了,没什么大不了,向存在的对象写数据要严重的多(可能写到其他关键内存区域)所以会报错
      

  4.   

    其实你跟进去看看源码就什么都清楚了,向combox添加字符串是这样实现的:
    lResult = SendMessage(  hWndControl, (UINT) CB_ADDSTRING,(WPARAM) wParam, 0, (LPARAM) (LPCTSTR) lParam;);  
    也就是向cmb控件发送了一个cbaddstring消息,而发消息的前提就这个窗口必须己创建存在。
      

  5.   

    m_Dlg.doModal()之前 窗口还没有创建好, 所以会报错。
    如果你是添加在OnInitDialog()里面的
    m_Dlg.DoModal()是创建窗口被显示 会调用OnInitDialog();