CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

怎么才能让EDIT编缉框能输入十六进制数?

楼主g60sl22c()2006-03-19 14:30:07 在 VC/MFC / 基础类 提问

我做了个对话框,上面放个编缉框edit1,关联变量为long,运行后发现只能输0-9的数字.  
  输fa或0xfa都不行,要使编缉框能输十六进制数,该怎么做? 问题点数:20、回复次数:19Top

1 楼wawaku(一堆裤衩!)回复于 2006-03-19 14:39:36 得分 0

用CString转一下试试Top

2 楼Mackz(在相互)回复于 2006-03-19 18:33:55 得分 5

关联为字符串CString。Top

3 楼wuqingabc(晴)回复于 2006-03-19 18:37:40 得分 2

用cstring,在ddt消息中对输入的字符进行处理,只接受数字和x,a~f等字符,然后用atoi函数转化为数字类型Top

4 楼g60sl22c()回复于 2006-03-20 02:41:51 得分 0

关联为cstring了,但atoi好似不行  
  d1=atoi("0x0"+m_source);这样不能转换,怎也转为0.  
  d1=StrToInt("0x0"+m_source);   又找不到头文件(加这个shlwapi.h不行),   试不了Top

5 楼bluewindyy(班班)回复于 2006-03-20 08:06:19 得分 5

strtol(将字符串转换成长整型数)      
  相关函数     atof,atoi,atol,strtod,strtoul  
     
  表头文件     #include<stdlib.h>  
     
  定义函数     long   int   strtol(const   char   *nptr,char   **endptr,int   base);  
     
  函数说明     strtol()会将参数nptr字符串根据参数base来转换成长整型数。参数base范围从2至36,或0。参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符则会使用16进制做转换。一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。  
     
  返回值     返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。  
     
  附加说明     ERANGE指定的转换字符串超出合法范围。  
     
  范例     /*   将字符串a,b,c   分别采用10,2,16进制转换成数字*/  
  #include<stdlib.h>  
  main()  
  {  
  char   a[]=”1000000000”;  
  char   b[]=”1000000000”;  
  char   c[]=”ffff”;  
  printf(“a=%d\n”,strtol(a,NULL,10));  
  printf(“b=%d\n”,strtol(b,NULL,2));  
  printf(“c=%d\n”,strtol(c,NULL,16));  
  }  
     
  执行     a=1000000000  
  b=512  
  c=65535  
     
       
   
     
   
     
  strtoul(将字符串转换成无符号长整型数)      
  相关函数     atof,atoi,atol,strtod,strtol  
     
  表头文件     #include<stdlib.h>  
     
  定义函数     unsigned   long   int   strtoul(const   char   *nptr,char   **endptr,int   base);  
     
  函数说明     strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。参数base范围从2至36,或0。参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制数等。当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符则会使用16进制做转换。一开始strtoul()会扫描参数nptr字符串,跳过前面的空格字符串,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。  
     
  返回值     返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。  
     
  附加说明     ERANGE指定的转换字符串超出合法范围。  
   
     
  Top

6 楼ggw(格格巫)回复于 2006-03-20 08:23:04 得分 2

子类化一下这个CEdit,派生一个CHexEdit,重载OnChar,判是不是在0-9,A-F   或a-f。转换就用楼上所说。Top

7 楼guyue6670()回复于 2006-03-20 10:46:09 得分 0

看来这能转化了。你让输入字符,版断是不是0-9,a-f,A-F,然后转化了。Top

8 楼g60sl22c()回复于 2006-03-20 12:52:41 得分 0

用这个at=strtoul(m_source,NULL,16);转换可以了,  
  转为string用这个itoa(code,str,16);  
  但第二步转换出来的高位无填0,我想转出来的字符串全是八个数Top

9 楼bluewindyy(班班)回复于 2006-03-20 21:33:16 得分 5

用sprintf格式化一下Top

10 楼wlwlxj(wlwlxj)回复于 2006-03-20 21:40:02 得分 0

自己做一个Edit类,SubClass上去,呵呵,一般重载PreTransMessage就可以,或者OnCharTop

11 楼jeapvan(多多)回复于 2006-03-21 08:49:42 得分 0

你直接設為字條串格式的,然後自己寫一個字條串轉換成十六進制的函數就可以了,  
  這個轉換函數應該是不難寫的Top

12 楼alexmayer(小豹)回复于 2006-03-21 09:20:32 得分 0

搬个凳子坐下听讲!Top

13 楼gbs0817(小小菜鸟)回复于 2006-03-21 09:41:55 得分 0

将Edit映射为CString类型号.     CString   strEdit;  
  long   a   =   1234;  
  strEdit.Format("%0x",a);  
  UpdateData(false);  
  这时显示的就是十六进制数了.Top

14 楼gbs0817(小小菜鸟)回复于 2006-03-21 09:57:30 得分 0

刚才看错了  
  响应Edit中的EN_CHANGE事件  
  在事件中添加下面代码  
  UpdateData(true);  
  char   ch;  
  if(m_strEdit.IsEmpty())  
  {  
  return;  
  }  
  if(ch   =   m_strEdit.GetAt(m_strEdit.GetLength()-1))  
  {  
  if(!(ch<='9'&&ch>='0'||ch>='a'&&ch<='f'||ch>='A'&&ch<='F'))  
  {  
  MessageBox("error","OK",MB_OK);  
  }  
  }Top

15 楼lixiaosan(小三)回复于 2006-03-21 10:03:54 得分 1

派生一个类即可  
   
  void   CMyHexEdit::OnChar(UINT   nChar,   UINT   nRepCnt,   UINT   nFlags)    
   
  {  
   
  if(   (nChar   >=   '0'   &&   nChar   <=   '9')   ||  
   
  (nChar   ==   '*')   ||  
   
  (nChar   ==   '#')   ||  
   
  (nChar   ==   8))  
   
  {  
   
  CEdit::OnChar(nChar,   nRepCnt,   nFlags);  
   
  }  
   
  else  
   
                  return;  
  }Top

16 楼lixiaosan(小三)回复于 2006-03-21 10:05:58 得分 0

改改  
  if(   (nChar   >=   '0'   &&   nChar   <=   '9')   ||  
   
  (nChar   >=   'a'   &&   nChar   <=   'f')   ||  
   
  (nChar   >=   'A'   &&   nChar   <=   'F')   ||  
   
  nChar   ==   8)  
   
  {  
   
  CEdit::OnChar(nChar,   nRepCnt,   nFlags);  
   
  }  
                  else    
                            return; Top

17 楼Stefine(CSDN最菜滴猩猩)回复于 2006-03-21 11:04:37 得分 0

肯定一下 :  
  关于字符转换的方法绝对是可以实现的!  
   
   
  小三,MSDN坏了  
  nChar   ==   8  
   
  8对应哪个字符?  
   
   
  Top

18 楼Stefine(CSDN最菜滴猩猩)回复于 2006-03-21 11:21:45 得分 0

呵呵,空格,猜也应该猜到了  
   
  楼主,还没搞完吗?Top

19 楼g60sl22c()回复于 2006-03-21 12:59:11 得分 0

因为经常用到,想搞清楚点.Top

相关问题

  • 请教高手如何在对话框中直接输入十六进制数
  • 如何在用printf()时输出八进、十六进制时显示(如,输入1,显示八:01,十六:0x1)
  • 请教一个问题:怎么把输入的汉字转为十六进制数
  • 字符串--->十六进制
  • 十六进制运算
  • 十六进to制二进制
  • 十六进制的问题!
  • 十六进制问题?
  • 十六进制的问题?
  • UCHAR类型转换为十六进制

关键词

  • 转换
  • 函数
  • 字符
  • 数字
  • 代码
  • 转化
  • 字符串
  • 长整型
  • 参数
  • 十六进制

得分解答快速导航

  • 帖主:g60sl22c
  • Mackz
  • wuqingabc
  • bluewindyy
  • ggw
  • bluewindyy
  • lixiaosan

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo