MFC - 通过主窗口向子窗口的listbox控件里赋值,并获取子窗口中listbox控件里的值

子窗口类: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方式保存。

 

LPSTR:32bit 指针指向一个 字符串,每个字符占1 字节
LPCSTR:32-bit指针指向一个常字符串,每个字符占1字节
LPCTSTR:32-bit指针指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针每字符可能占1字节或2字节,取决于Unicode是否定义
L是表示字符串资源为Unicode的。

LPCTSTR:用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。LPCTSTR就表示一个指向const对象的指针。

 

 

LPCTSTR == constTCHAR * //CString 和 LPCTSTR 可以说通用。
CString 转LPCTSTR:
CString cStr;
const char *lpctStr=(LPCTSTR)cStr;
LPCTSTR转CString:
LPCTSTR lpctStr;
CString cStr=lpctStr;
lstrcpy:  函数功能:该函数复制一个字符串到缓冲区。
函数原型:LPTSTR lstrcpy(LPTSTR lpString1,LPCTSTR lpString2);
参数:
lpString1:指向接收由参数lpString2指向字符串内容的缓冲区。缓冲区必须足够大来容纳字符串,还包括最后的NULL终止符。
lpString2:指向待复制的以NULL为终止符的字符串。
返回值:若函数运行成功,返回值是缓冲区的 指针;若函数运行失败,返回值是NULL。若想获得更多错误信息,请调用GetLastError函数。
TCHAR和char: char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。Windows为了消除各编译器的差别,重新定义了一些数据类型。
CHAR为单字节字符。还有个WCHAR为Unicode字符,即不论中英文,每个字有两个字节组成。
如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。LPCSTR 相当于CONST CHAR * 和LPSTR 相当于CHAR *。

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值