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],一般是不会错的。
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都是这个设置。
更多精彩
赞助商链接