WEB开发网
开发学院软件开发VC VC密码框显示字符的终极设置方法 阅读

VC密码框显示字符的终极设置方法

 2012-09-15 17:15:02 来源:WEB开发网   
核心提示: 用过VC开发过Windows应用程序的人都知道,Edit 编辑框控件可设置为密码样式 (ES_PASSWORD),VC密码框显示字符的终极设置方法,但默认的密码通常是最普通的英文星号(*),这个星号有点过小,Windows下是2字节)后再发送,这里我假定编码是2字节的GB2312,不便于观察,根据MSDN的描述

 

用过VC开发过Windows应用程序的人都知道,Edit 编辑框控件可设置为密码样式 (ES_PASSWORD)。但默认的密码通常是最普通的英文星号(*),这个星号有点过小,不便于观察。根据MSDN的描述,如果使用MFC的CEdit类,可调用SetPasswordChar设置密码字符。但问题是,如果工程的字符集是ANSI多字节字符,这样只能设置英文字符,因为该接口参数的类型是CHAR,不是WCHAR。当然,如果你的工程是Unicode字符集的,那么你就不需要看本文了。
如何将星号(*)改成大圆点(●)呢?MSDN说,Windows XP及其之后的系统中的comctl32.dll是6.0版本默认支持大圆点,不过本人折腾了很久也没折腾出来。后来也不想折腾了,原因很简单,如果客户要求的密码提示符是“密”,即输入“123”显示的是“密密密”,那就算折腾出来默认大圆点也没什么意义了。
查看了EDIT控件的手册,发现 EM_SETPASSWORDCHAR 消息可以帮我们实现目标:
lResult = SendMessage(   // returns LRESULT in lResult
  (HWND) hWndControl,   // handle to destination control
  (UINT) EM_SETPASSWORDCHAR,   // message ID
  (WPARAM) wParam,   // = (WPARAM) () wParam;
  (LPARAM) lParam   // = 0; not used, must be zero
);
不过这个消息的用法可不大简单,像下面这样的方法都是不行的:
 
 
SendMessage(EM_SETPASSWORDCHAR, WPARAM(L‘密’), LPARAM());
SendMessage(EM_SETPASSWORDCHAR, WPARAM('密'), LPARAM());
SendMessage(EM_SETPASSWORDCHAR, WPARAM(_T('密')), LPARAM());
 
 
 
下面介绍本人摸索出的终极大法:
 
 
std::vector<char> v(MB_CUR_MAX); // 或者 char v[10] = {};
wctomb(v.data(), L'●'); // 可以改成: L'密'
SendMessage(EM_SETPASSWORDCHAR, WPARAM(MAKEWORD(v[1], v[0])), LPARAM());
 
 
 
请注意,
MB_CUR_MAX是stdlib.h中定义的一个宏,VC实现为函数,所以这里用了vector,你也可以直接写char v[10],一般是不会错的。

wctomb也是stdlib.h中定义的一个函数,用于在程序运行时根据当前的全局locale设置将宽字符转换成多字节字符序列。

最后,SendMessage中的WPARAM要特别注意,因为EDIT希望得到的是一个宽字符的编码,而不是多字节字符序列;所以要将v转换成一个数字(wchar_t类型,Windows下是2字节)后再发送。这里我假定编码是2字节的GB2312,因为大部分中文windows用户的locale都是这个设置。

Tags:VC 密码 显示

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接