在MFC编程中,我们对控件关联变量应该很清楚了,比如通过classwizard给编辑框设置一个关联变量,然后就可以调用了:
如: m_edit.SetWindowText("aa");
这是正确的。但是你也知道有另外一种方法,如:
GetDlgItem(IDC_EDIT1)- >SetWindowText("aa");
这也是正确的。
下面我还有一种写法,你认为正确吗?
首先定义一个成员变量
CEdit *p_edit;
然后响应WM _INITDIALOG:
BOOL Cmydlg:: OnInitDialog()
{
p_edit=(CEdit*)GetDlgItem(IDC_EDIT1);
p_edit->SetWindowText(" aa");
}
好像和上面的写法一摸一样啊,只是用一个指针变量来代替GetDlgItem()的返回值罢了,你这样认为吗?
很遗憾,错误!刚刚开始的时候,我想不通。只是先用一个变量来代替返回值,为什么会错误呢?难道这个函数GetDlgItem()的返回值有问题?
没办法,只好去查MSDN。此时我的心情是郁闷的,因为当你突然发现你平时认为很正确的理论或者技术竟然是错误的或者你的理解是不完整的,打击是非常大的。不光是对你能力的不肯定,还有一个原因是你把这个错误技术已经应用到很多领域,会造成多大的损失,实在不敢再往下想!
当然还有一种激动。因为我很快就要解开谜底了。最好这个谜底是对我以前的理解的补充,而不是全盘否定,那样的话我会疯了!还好如我所愿。
让我们来看看MSDN的说法:
CWnd::GetDlgItem
CWnd* GetDlgItem( int nID ) const;
void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;
Return Value
A pointer to the given control or child window. If no control with the integer ID given by the nID parameter exists, the value is NULL.
The returned pointer may be temporary and should not be stored for later use.
看到这句话了吗?是说这个返回指针是短暂的,而且不能推迟用。谜底终于解开了!
可是我还是有个问题不明白。为什么是短暂的?什么意思?还有第一种关联变量的方法是先定义了一个变量,而这里用GetDlgItem在调用指针之前并没有哪里先创建对象啊?指针指像谁?难道。。。?
看贴的朋友,能回答我的问题吗?
评论