当前位置:编程学习 > VC++ >>

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


用过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
);
不过这个消息的用法可不大简单,像下面这样的方法都是不行的:

[cpp]
SendMessage(EM_SETPASSWORDCHAR, WPARAM(L‘密’), LPARAM()); 
SendMessage(EM_SETPASSWORDCHAR, WPARAM('密'), LPARAM()); 
SendMessage(EM_SETPASSWORDCHAR, WPARAM(_T('密')), LPARAM()); 

下面介绍本人摸索出的终极大法:

[cpp
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都是这个设置。

补充:软件开发 , Vc ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,