怎么样使编辑框只能接受中文???

akonlbjrd 2010-05-01 12:52:51
各位大牛,小弟在用mfc做一个管理系统,请问怎么样使编辑框只能输入中文!!!各位大牛,帮帮小弟啦!!!
...全文
632 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
只是空想家 2011-06-01
  • 打赏
  • 举报
回复
想知道怎么读中文
qwaszx6641 2011-03-11
  • 打赏
  • 举报
回复
在OnChar里面截获
Eleven 2010-05-01
  • 打赏
  • 举报
回复
char* old_locale = _strdup(setlocale(LC_CTYPE,NULL));
setlocale( LC_CTYPE, "chs" );//设定区域为中文
setlocale( LC_CTYPE, old_locale );

你设置为中文以后又把它还原了,所以写不进去。

如果你要追加文件的话,加上CFile::modeNoTruncate标示来Open文件

下面这个例子将字符串"Hello,World!!你好!!!"以追加的方式写入文件中两次

char* old_locale = _strdup(setlocale(LC_CTYPE,NULL));
setlocale( LC_CTYPE, "chs"); // 在写文件之前,设置语言区域
try{
CStdioFile file;
file.Open(_T("F:\\11.txt"), CFile::modeWrite|CFile::modeNoTruncate);

file.SeekToEnd(); // 将文件指针定位到末尾

for(int i=0; i<2; i++)
{
file.WriteString(_T("Hello,World!!你好!!!\r\n"));
}
file.Close();
}
catch(CFileException* e)
{
e->ReportError();
e->Delete();
}

setlocale( LC_CTYPE, old_locale ); // 最后还原原来的设置
free(old_locale);
nrxtgcb 2010-05-01
  • 打赏
  • 举报
回复
先让他输入,然后再判断是否是中文,如果不是中文的提示一下就OK。
akonlbjrd 2010-05-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]
你是在Unicode环境下用CStdioFile直接写中文话是有问题的,这个是MS的bug。
你可以用CFile类,将CString转成char*写入文件,如果你一定要用CStdioFile类写文件的话,可以使用下面的方法:


C/C++ code

#include <locale>

CStdioFile file;
file.Open(_T("F:\\11.txt……
[/Quote]老大帮我看看啦!!我很急的啦!!!
尹成 2010-05-01
  • 打赏
  • 举报
回复
void CEditEx::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
if( ::IsDBCSLeadByte(nChar) )
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
else
{
AfxMessageBox( _T("只能输入中文") );
}
}
hio131 2010-05-01
  • 打赏
  • 举报
回复
- - 要回车的话加上回车符和换行符就行了 \n \r


这里是我的一段判断代码 只允许输入数字和小数点、负号 并且可以把中文句号转换为小数点

重不重载CEdit貌似没多大关系 不过要改的东西多的话还是重载吧

void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(nChar == 45)// 减号
{
CString str_;
GetWindowText(str_);
int NotEmpty = str_.GetLength();
int pos = str_.Find(_T("-"));
if(!pos)
nChar = 0;
else
{
if(!NotEmpty)
CEdit::OnChar(nChar, nRepCnt, nFlags);
else
nChar = 0;
}

}
if(nChar == 46 || nChar == 12290)//小数点 或中文句号
{
CString StrDot;
GetWindowText(StrDot);
int Pos = StrDot.Find(_T("."));
if(Pos>=0)
nChar = 0;
else
{
if(nChar == 12290)
{
nChar = 46;
nFlags = 52;
ReplaceSel(_T("."));
}
else
CEdit::OnChar(nChar, nRepCnt, nFlags);
}

}



if(nChar == 8) //退格键
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
if(nChar<48 || nChar>57) //允许输入数字
nChar = 0;
else
CEdit::OnChar(nChar, nRepCnt, nFlags);
}

akonlbjrd 2010-05-01
  • 打赏
  • 举报
回复
怎么样使下一次输入的数据能从下一行写入
如:EmpolyeeInfo.txt文本里面的数据为:
单打独斗 222 男 22 小学 软件研发部 22 22 到底
下一次在写入的时候就会自动覆盖点,请问该怎么办啦???

akonlbjrd 2010-05-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]
你是在Unicode环境下用CStdioFile直接写中文话是有问题的,这个是MS的bug。
你可以用CFile类,将CString转成char*写入文件,如果你一定要用CStdioFile类写文件的话,可以使用下面的方法:


C/C++ code

#include <locale>

CStdioFile file;
file.Open(_T("F:\\11.txt……
[/Quote]
我把代码改成这样了还是不行啊???



UpdateData( TRUE);
char* old_locale = _strdup(setlocale(LC_CTYPE,NULL));
setlocale( LC_CTYPE, "chs" );//设定区域为中文
setlocale( LC_CTYPE, old_locale );


CStdioFile file(_T("EmpolyeeInfo.txt"), CFile::modeCreate|CFile::modeWrite);

CString str;

str+=m_name;
str+="\t";
str+=m_number;
str+="\t ";

if (m_male==-1)
{
MessageBox(_T("你没有选择职工的性别,请选择!"));

}
if (m_male==0){str+="男 ";str+="\t ";}

if (m_male==1){str+="女 ";str+="\t ";}


str+=m_age;
str+="\t ";
int index=m_Degree.GetCurSel();
CString strtemp;
m_Degree.GetLBText(index,strtemp);

str+=strtemp;
str+="\t ";
index=m_department.GetCurSel();
m_department.GetLBText(index,strtemp);
str+=strtemp;
str+="\t ";
str+=m_wage;
str+="\t ";
CString temp;
temp.Format(_T("%s\r\n"),str);

file.WriteString(temp);


file.Close();
free(old_locale);//还原区域先前设定
MessageBox(_T("添加新职工成功了!"));
refreshnumber(1);
Eleven 2010-05-01
  • 打赏
  • 举报
回复
你是在Unicode环境下用CStdioFile直接写中文话是有问题的,这个是MS的bug。
你可以用CFile类,将CString转成char*写入文件,如果你一定要用CStdioFile类写文件的话,可以使用下面的方法:


#include <locale>

CStdioFile file;
file.Open(_T("F:\\11.txt"), CFile::modeCreate|CFile::modeReadWrite);
char* old_locale = _strdup(setlocale(LC_CTYPE,NULL));
setlocale( LC_CTYPE, "chs" );//设定区域为中文
file.WriteString(_T("Hello,World!!你好!!!"));//正常写入
setlocale( LC_CTYPE, old_locale );
free(old_locale);//还原区域先前设定
alicktony 2010-05-01
  • 打赏
  • 举报
回复
重写一个CEDIT,重写CEDIT的onchar消息处理函数就可以了
Eleven 2010-05-01
  • 打赏
  • 举报
回复
你写的是中文吧。。。
akonlbjrd 2010-05-01
  • 打赏
  • 举报
回复
数据没有问题啊!!我刚开是用cfile写的时候可以写进去啦???各位帮帮忙啦??
向立天 2010-05-01
  • 打赏
  • 举报
回复
你跟进去看看数据有没有问题
akonlbjrd 2010-05-01
  • 打赏
  • 举报
回复
还有一个问题
UpdateData( TRUE);
CStdioFile file(_T("EmpolyeeInfo.txt"), CFile::modeCreate|CFile::modeWrite);

CString str;

str+=m_name;
str+="\t";
str+=m_number;
str+="\t ";

if (m_male==-1)
{
MessageBox(_T("你没有选择职工的性别,请选择!"));

}
if (m_male==0){str+="男 ";str+="\t ";}

if (m_male==1){str+="女 ";str+="\t ";}


str+=m_age;
str+="\t ";
int index=m_Degree.GetCurSel();
CString strtemp;
m_Degree.GetLBText(index,strtemp);

str+=strtemp;
str+="\t ";
index=m_department.GetCurSel();
m_department.GetLBText(index,strtemp);
str+=strtemp;
str+="\t ";
str+=m_wage;
str+="\t ";
CString temp;
temp.Format(_T("%s\r\n"),str);


file.WriteString(temp);

file.Close();

各位老大,帮我在看看为什么不能把str写到EmpolyeeInfo.txt中啦??我试了好多次都不知道啦
lx_616_at_yeah_net 2010-05-01
  • 打赏
  • 举报
回复


void CEditEx::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if( ::IsDBCSLeadByte(nChar) )
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
else
{
AfxMessageBox( _T("只能输入中文") );
}
}

akonlbjrd 2010-05-01
  • 打赏
  • 举报
回复
没有人吗??不会都睡觉准备明天好好度假吧??

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧