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 ,