求一个CEidt派生类 这个派生类只允许接受16进制字符的输入而且输入过程中自动用空格按字节隔开例如:键盘输入50163738,CEdit得到50 16 37 38 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在编辑框内输入的是文本所以你必须把输入的文本数字读取到一个CString str对象内然后从左到右 2个2个地取数字并利用 atoi(str) 进行转换处理。居然怎么判断是否16进制的,就要写好过滤的代码了。 简单, 重载OnChar函数,在里面判断输入的字符是不是0-9 & a-z & A-Z & 空格。 void CHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { TCHAR tChar = (TCHAR) nChar; if((IsCharAlphaNumeric(tChar) && !IsCharAlpha(tChar)) || (tChar >= 'a' && tChar <= 'f') || (tChar >= 'A' && tChar <= 'F') || tChar == '\b') { CEdit::OnChar(nChar, nRepCnt, nFlags); } else { MessageBeep(MB_ICONASTERISK); }} 1.用GetWindowText()取得已输入的内容2.判断内容长度,每两个字符就加一个空格3.把结果显示到CEdit里兄弟,还是自已多动动手吧。 确实想的太简单了1.派生类的OnChar()函数必须响应BackSpace按键,否则无法修改录入的内容;2.对录入的内容进行判定,如果非16进制那么不响应;如果是16进制数据做双字节的判断,我写了下逻辑,各位看看OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){ char ch = char(nChar); if (ch == '\b')//if the char is Backspace then deal with the edit { } else if( !((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) )// if the char is non-heximal , then give up { return; } CEdit::OnChar(nChar, nRepCnt, nFlags);//加上数字的处理} 重载CEdit类,加入成员变量unsigned short last;override 成员函数bool PreTranslaeMessage(MSG* pMsg){ int c=(int)pMsg->wParam; if(c>=48&&c<=57||c>='A'&&c<='F') { last++; if(last==2) { last=0; SendMessage(WM_CHAR,32,0); } return CEdit::PreTranslateMessage(pMsg); } else if(c>='a'&&c<='f') { last++; if(last==2) { last=0; SendMessage(WM_CHAR,32,0); } pMsg->wParam-=32; return CEdit::PreTranslateMessage(pMsg); } else return TRUE;}例如键盘输入123456789则CEdit会这样显示:1 23 45 67 89.第一个字符会落单,后面的字符都可以.这个BUG真不知道出现在哪里???? 把输入的字符都保存到CArray或CList中保存,每次有输入时,先检查输入字符的正确性,再用已保存的字符数组来判断当前操作能否继续执行 跟进去PRETRANSLATEMESSAGE调试下?last有初始化为0? 高手快来啊解决不了,我睡不安稳...为什么会有那样的BUG 你只是重载了PreTranslateMessage而已?其他函数怎么重载的,目前按你给的代码测试,发现字符无法输入。但看了一下原代码,发现last++ 这句,是不是应该放在追加字符之后才合理,不应该放在最开始的判断位置。另外,PreTranslateMessage内第一个判断内是不是漏了pMsg->wParam-=32; 这句? 你要仔细分析你自己的代码在PreTranslateMessage里SendMessage?要小心自己的逻辑!改成下面就OK了BOOL CDEdit::PreTranslateMessage(MSG* pMsg) { if(pMsg->message==WM_CHAR) { int c=(int)pMsg->wParam; if((c>=48&&c<=57)||(c>='A'&&c <='F')||(c>='a'&&c <='f')) { last++; if(last==2) { last=0; PostMessage(WM_CHAR,32,0); } } } return CEdit::PreTranslateMessage(pMsg);} 已知对话框的句柄,怎么获得其按钮的句柄并发送消息 DECLARE_MESSAGE_MAP()之前之后有什么区别? 关于InternetOpen C++“树”数据结构 debag编译能通过,release编译通不过 同样的double数据相乘结果却不一样 请问哪里有SourceSafe的服务器以及客户端的完整下载? mschart数据输入问题,在线等!急 菜鸟请您帮助2 敢问谁是高手???? gina中2003远程登录如何处理? 再发一帖子,求解决CEdit派生类的一个BUG
然后从左到右 2个2个地取数字并利用 atoi(str) 进行转换处理。居然怎么判断是否16进制的,就要写好过滤的代码了。
void CHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
TCHAR tChar = (TCHAR) nChar; if((IsCharAlphaNumeric(tChar) && !IsCharAlpha(tChar))
|| (tChar >= 'a' && tChar <= 'f') || (tChar >= 'A' && tChar <= 'F')
|| tChar == '\b')
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
else
{
MessageBeep(MB_ICONASTERISK);
}}
2.判断内容长度,每两个字符就加一个空格
3.把结果显示到CEdit里兄弟,还是自已多动动手吧。
2.对录入的内容进行判定,如果非16进制那么不响应;如果是16进制数据做双字节的判断,我写了下逻辑,各位看看
OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
char ch = char(nChar); if (ch == '\b')//if the char is Backspace then deal with the edit
{ }
else if( !((ch >= '0' && ch <= '9')
|| (ch >= 'A' && ch <= 'F')
|| (ch >= 'a' && ch <= 'f'))
)// if the char is non-heximal , then give up
{
return;
} CEdit::OnChar(nChar, nRepCnt, nFlags);//加上数字的处理}
override 成员函数bool PreTranslaeMessage(MSG* pMsg)
{
int c=(int)pMsg->wParam;
if(c>=48&&c<=57||c>='A'&&c<='F')
{
last++;
if(last==2)
{
last=0;
SendMessage(WM_CHAR,32,0);
}
return CEdit::PreTranslateMessage(pMsg);
}
else if(c>='a'&&c<='f')
{ last++;
if(last==2)
{
last=0;
SendMessage(WM_CHAR,32,0);
}
pMsg->wParam-=32;
return CEdit::PreTranslateMessage(pMsg);
}
else return TRUE;
}
例如键盘输入123456789
则CEdit会这样显示:1 23 45 67 89.第一个字符会落单,后面的字符都可以.
这个BUG真不知道出现在哪里????
last有初始化为0?
解决不了,我睡不安稳...为什么会有那样的BUG
其他函数怎么重载的,目前按你给的代码测试,发现字符无法输入。但看了一下原代码,发现last++ 这句,是不是应该放在
追加字符之后才合理,不应该放在最开始的判断位置。
另外,PreTranslateMessage内第一个判断内是不是漏了
pMsg->wParam-=32; 这句?
在PreTranslateMessage里SendMessage?
要小心自己的逻辑!
改成下面就OK了
BOOL CDEdit::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_CHAR)
{
int c=(int)pMsg->wParam;
if((c>=48&&c<=57)||(c>='A'&&c <='F')||(c>='a'&&c <='f'))
{
last++;
if(last==2)
{
last=0;
PostMessage(WM_CHAR,32,0);
}
}
}
return CEdit::PreTranslateMessage(pMsg);
}