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
);

不过这个消息的用法可不大简单,像下面这样的方法都是不行的:

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

密码字符选择可参考 http://tool.xker.com/gb2312tbl.php ,随便找一个字符都可以作为密码提示字符啦!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值