用递归算法解决VC中CEdit的一个Bug(2)
解决问题的算法
针对以上存在的问题,在取得编辑框的内容后,可以使用递归算法来过滤掉相关输入。
算法思想:
从第一行开始,以回车换行为一次递归调用,把每次的结果加起来。递归的思路是:根据每行最大的字符数,对每行进行判断,如果最后一个字符是空格,则把那个空格删除,最后,把不需要的空格都删除掉了。调用程序如下:
CString strText, strObjText, strExchange;
CEdit *pEdit;
UpdateWindow();
pEdit = (CEdit *)GetDlgItem(IDC_ET_CON);
int nPos = 0, nLen = 0;
int nMaxCols = 20;
strObjText = "";
pEdit->GetWindowText(strText);
nPos = strText.Find("
");
while(nPos != -1)
{
strExchange = strText.Left(nPos);
strText = strText.Right(strText.GetLength() - nPos -2);
TrimEndNull(nMaxCols, strExchange, nMaxCols);
strObjText = strObjText + strExchange + "
";
nPos = strText.Find("
");
}
strExchange = strText;
TrimEndNull(nMaxCols, strExchange, nMaxCols);
strObjText = strObjText + strExchange;
pEdit->SetWindowText(strObjText);
UpdateWindow();
递归函数如下:
TrimEndNull(int nPos, CString &strExchange, const int nMaxCols)
{
if (nPos >= strExchange.GetLength())
return;
if (strExchange.GetAt(nPos) == ' ')
{
strExchange = strExchange.Left(nPos) +
strExchange.Right(strExchange.GetLength() - nPos - 1);
}
nPos = nPos + nMaxCols;
TrimEndNull(nPos, strExchange, nMaxCols);
}
现在程序运行结果如下:
原始输入
替换后
输入A,B后,能够输满编辑框
结束语
本文主要讨论了解决VC++中的CEdit控件的一个Bug,使用了大家熟习的递归算法,通过对这个Bug的分析,使用递归算法后,这个难于解决的问题就变得很简单了。