【求助】如何禁止EDIT中输入中文

lvgame 2004-07-22 09:44:00
一个输入密码的EDIT,当设置了PASSWORD的属性后,就不可以输入中文了。

但是我现在需要用户选择是显示密文还是显示明文,如果显示明文,则去掉EDIT的PASSWORD属性,但同时EDIT也可以输入中文了。

请问,如何才能禁止EDIT中输入中文,或者用户输入后判断出EDIT输入了中文?谢谢。
...全文
406 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangjinbao 2004-09-03
  • 打赏
  • 举报
回复
ok
lvgame 2004-07-22
  • 打赏
  • 举报
回复
感谢大家,解决了。
ACA 2004-07-22
  • 打赏
  • 举报
回复
密码也可以用中文的,复制过去就可以了
lixiaosan 2004-07-22
  • 打赏
  • 举报
回复
转载

GB2312/GBK用的是高位区码(GBK用扩展的区码)+高位位码拼成一个全角字(双字节),由于区码和位码都在128以上,并且没有可靠的算法分辩两个字节(原因下面我会解释),需要准确搜索时,不能随便从中间定位,因为如果错开了一个字节,就会造成乱码,这样诸如二分法之类的算法都不灵了。
当然,如果你是用等宽的编码,比如UNICODE,或GB2312/GBK全汉字字符(英文和标点用全角汉字),就没有上面的问题,WINDOWS内部就用双字节的UNICODE,代价是资源消耗很大,而后一种所有字符都采用全角的情况很少见。
注:GBK是GB2312的扩展,而GB2312最大的问题之一,是区码的码位和位码规则完全一样,原始的GB2312区位,区是从1到94,位也是1到94,护展到机内码是区号+160,位号加160,各占一个字节,因此从理论上来说,在字符串内以字节为单位随机取一个字节开始,没有可靠的算法可以分辩出这个字节是区码还是位码,而它后面的字串也跟着不能确定,于是精确的搜索字串只能老老实实从第一个字节开始扫描,见到第一个128以上的字节就当成汉字的区位,从它开始定位两个一组解析,直到发现第一个ASCII码为止,于是以字节为单位转入ASCII的分析,直到发现一个大于128的字符......这种循环效率低下是肯定的。

使用IsDBCSLeadByte判断一个字符是否是双字的第一个字节
lvgame 2004-07-22
  • 打赏
  • 举报
回复
感谢楼上的例子,现在的思路比较清晰了:)
bager 2004-07-22
  • 打赏
  • 举报
回复
1.#include "NewEdit.h"
2.CNewEdit替换CEdit


#if !defined(AFX_NEWEDIT_H__804C35C8_B97B_4E40_9110_26CD185A02E7__INCLUDED_)
#define AFX_NEWEDIT_H__804C35C8_B97B_4E40_9110_26CD185A02E7__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// NewEdit.h : header file
//

class CNewEdit : public CEdit
{
// Construction
public:
CNewEdit();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNewEdit)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CNewEdit();

// Generated message map functions
protected:
//{{AFX_MSG(CNewEdit)
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};



//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_NEWEDIT_H__804C35C8_B97B_4E40_9110_26CD185A02E7__INCLUDED_)


// NewEdit.cpp : implementation file
#include "stdafx.h"
#include "NewEdit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CNewEdit::CNewEdit()
{
}

CNewEdit::~CNewEdit()
{
}

BEGIN_MESSAGE_MAP(CNewEdit, CEdit)
//{{AFX_MSG_MAP(CNewEdit)
ON_WM_CHAR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CNewEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(IsDBCSLeadByte(nChar))
{
return;
}
CEdit::OnChar(nChar, nRepCnt, nFlags);
}


huaboy408 2004-07-22
  • 打赏
  • 举报
回复
自己従CEdit継承一個類
然后重載
void CHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString strText;
CString Holder = "0987654321abcdefABCDEF";

GetWindowText(strText);
if((nChar != 22) // Ctrl + V
&& (nChar != 3) // Ctrl + C
&& (nChar != 24) // Ctrl + X
&& (nChar != VK_BACK) // BackSpace
&& (Holder.Find(nChar) == -1)) //"0987654321abcdefABCDEF"
{
return;
}

CEdit::OnChar(nChar, nRepCnt, nFlags);
} // end of OnChar()
lvgame 2004-07-22
  • 打赏
  • 举报
回复
感谢。

就我知道GB和BIG5在编码上存在很大差异,这对我的判断是不是会早成影响?用IsDBCSLeadByte是不是可以不用关心是GB和BIG5?查看了MSDN,IsDBCSLeadByte可以用来判断是不是双字节,非零则是,零则是单字节,是不是这样?

还有,能不能说说如何在OnChar中判断呢?
FlyNesta 2004-07-22
  • 打赏
  • 举报
回复
汉字是双字节,且第一个字节的ascii值小于0,你可以在onchar里做一下判断。
Kudeet 2004-07-22
  • 打赏
  • 举报
回复
中文汉字是占两个字节。试试IsDBCSLeadByte函数判断一个字符是不是双字的第一个字节。
zhangnanonnet 2004-07-22
  • 打赏
  • 举报
回复
在onchar事件中控制输入的ASCII码

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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