我用的是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");
运行正常
请问这是为什么呢?
定义了一个对象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");
运行正常
请问这是为什么呢?
m_Dlg.m_Test_Check = FALSE;
m_Dlg.m_Test_Radio = 0;
m_Dlg.DoModal();
这样就是可以正常,再比如执行像m_Dlg.m_ComBoxCtrl.GetLBText()这样也是没问题的。
m_Dlg.m_Test_Radio = 0;
定义的时简单数据类型变量当然没问题。
m_ComBoxCtrl变量是复杂的控件型变量,需要涉及初始化和加载GDI资源,所以不一样的。
GetLBText()是读取,对一个不存在的对象读取,返回空白就行了,没什么大不了,向存在的对象写数据要严重的多(可能写到其他关键内存区域)所以会报错
lResult = SendMessage( hWndControl, (UINT) CB_ADDSTRING,(WPARAM) wParam, 0, (LPARAM) (LPCTSTR) lParam;);
也就是向cmb控件发送了一个cbaddstring消息,而发消息的前提就这个窗口必须己创建存在。
如果你是添加在OnInitDialog()里面的
m_Dlg.DoModal()是创建窗口被显示 会调用OnInitDialog();