最近写点东西,发现果断还是把老师教的都还回去了.......额,但是在我敲键盘的过程中,又汲取回来啦。
总结一下最近犯的错误吧,给自己提个醒,希望不要再犯了~
1.用控件变量获取输入的文本,出错。
代码:CString str;
m_edEdit.GetWindowText(str);
......
因为函数挺长,所以好一会都没发现问题在哪里。后来利用“注释法”(个人觉得好实用的方法~~),找到了问题:m_edEdit.GetWindowText(str);
错误原因在于,window不止一个,所以编译链接是没有问题的,但是运行获取文本时,就会出现错误!
修改:GetDlgItem(IDC_XXX)->GetWindowText(str); 首先根据ID得到控件,获取该控件上的文本。这样就不会出错啦!
这个问题的本质原因是没有将变量与控件关联,这个有可能是编码者自定义的控件变量,例如:CEdit m_edEdit; 然后直接开始使用。
所以也可以在void CCLayerDlg::DoDataExchange(CDataExchange* pDX)中添加:DDX_Control(pDX, IDC_XXX, m_edEdit);
2.字符间的转换
这个应该检讨一下,之前只觉得是小细节,没有太多的注意。真正使用的时候才发现原来里面蛮有学问的,所以特意搜了一些资料,总结的挺详细的。我以身试法的说说看,希望能够尽量通俗。
(1)将wstring转换为CString
源代码:
void CXXXView::OnCurName()
{
// TODO: 在此添加命令处理程序代码
CXXXDoc* pDoc = GetDocument();
std::wstring wstrName;
wstrName= pDoc->m_ap->GetName();
CString str;
str.Format(_T("名称:%s"),wstrName.c_str());//利用c_str()函数进行转换
AfxMessageBox(str);
}
(2)_T的关键性作用
UINT CurID;
CurID = pDoc->m_ap->GetID();
CString str;
str.Format(_T("ID号是:%u"),CurID);//此处如果不加_T就会出错
AfxMessageBox(str);
查看项目的属性会发现:
Uincode字符集进行解码时,_T必须加上。如果是其他,则_T可有可无。(此处关于_T宏会再学习,再解释)
(3)将CString转换为wstring
m_wtrName = str.AllocSysString(); //同样也是利用函数来实现
关于字符间的转换,在网上找到了一篇挺详细的文章。随后会转载~~