【改错】总结一下近几天犯的错误

最近写点东西,发现果断还是把老师教的都还回去了.......额,但是在我敲键盘的过程中,又汲取回来啦。

总结一下最近犯的错误吧,给自己提个醒,希望不要再犯了~

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(); //同样也是利用函数来实现

关于字符间的转换,在网上找到了一篇挺详细的文章。随后会转载~~

原文地址:https://www.cnblogs.com/xxt1991/p/2419990.html