子窗口类:CSelectObj;
CListBox m_SelectObj;//子窗口listbox控件变量
主窗口:
下面是错误的写法
/
CString m_obj_name;
extern CSelectObj selectObj_dlg;
selectObj_dlg.m_SelectOb.AddString("***");
if(selectObj_dlg.DoModal())
{
int obj_line=0;
obj_line = m_SelectObj.GetCurSel();
selectObj_dlg.m_SelectObj.GetText(obj_line, m_obj_name);
}
//
以下是正确的步骤
1、首先在子对话框中通过“建立类向导”添加对话框初始化函数BOOL CSelectObj::OnInitDialog();
2、在子对话框类中添加成员函数,用于接收从主对话框中传递过来的数据,实现的功能如下:
void CSelectObj::SetDlgMessage(LPCTSTR lpsetMessage)
{
lstrcpy(m_setMesage, lpsetMessage);
}
//m_setMesage是子类的成员变量,用于存储主对话框传递来的数据
然后在主对话框的程序中调用这个函数
SetDlgMessage("***");
3、在 CSelectObj::OnInitDialog()函数中添加如下代码:
m_SelectObj.AddString(listMessage[i].m_setMesage);
通过以上步骤就能在子对话框中的listbox控件里添加数据
如果要获取子对话框listbox控件的数据,做法如下
1、首先在子对话框中获取控件里的值并存入到成员变量.m_setMesage中
2、在主对话框程序中
extern CSelectObj selectObj_dlg;
CString obj_name;
obj_name = selectObj_dlg.m_setMesage;
这样就可以了。
之所以采取以上的步骤,原因如下
1、DoModal()函数:DoModal();这个函数返回之后窗口本身就销毁了,当然也是不能获取窗口本身指针以及其上的子窗口指针的!这句话的意思就是说,当使用selectObj_dlg.DoModal()时其实是在创建一个窗口,在这句话执行完之后创建的窗口就已经销毁了,所以在这句话之前之后都是不能获取窗口本身指针以及其上的子窗口指针的,只能采取传递变量的方式。
//窗口类对象创建了,并不代表窗口本身创建了;而窗口本身如果创建了,那么窗口类对象肯定是已经创建出来了。
CSelectObj selectObj_dlg创建了窗口类对象,而selectObj_dlg.DoModal();才是创建窗口本身的源泉,其内部肯定是最终调用CreateWindow这个API来创建窗口本身最终通过GDI显示在屏幕上供我们肉眼看的!DoModal()之后窗口对象就析构了,怎么可能在DoModal()之后获取窗口对象及其子窗口呢?
在调用DoModal()的时候就会执行子窗口的初始化函数BOOL CSelectObj::OnInitDialog(),如果要进行控件初始化的话最好是在该初始化函数里面进行。
参考文章:http://bbs.csdn.net/topics/390957303
http://bbs.csdn.net/topics/390957946?page=1
其他:
_T:_T("")是一个宏,定义于tchar.h下。他的作用是让你的程序支持Unicode编码,因为Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理像中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。
如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。
LPCTSTR:用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。LPCTSTR就表示一个指向const对象的指针。
CHAR为单字节字符。还有个WCHAR为Unicode字符,即不论中英文,每个字有两个字节组成。