在阅读和学习《MATLAB GUI设计学习手册(第2版)》时,发现书中第11章有讲解登录界面实现的例子。在复现示例中密码框的功能时,遇到了以下三个问题:密码框使用Edit控件,通过KeyPressFcn回调函数将输入密码隐藏存储,并用星号‘*’进行显示。但在键入密码的过程中,光标一直显示在星号左侧,如下图所示;在键入密码的过程中,若将整个密码框内容清空后重新输入,密码框内显示的星号数量会与键入的密码数量不符;若将Edit控件的'Enable'属性设置为'Inactive',密码框内光标便会消失,无法键入密码。示例中采用窗口的KeyPressFcn回调函数执行登录界面的密码输入功能,但在使用过程中单击密码框依旧无效,需要单击窗口界面后才可键入密码。
通过查阅资料,并结合自身的理解,对于上述的三个问题,可给出如下原因
关于密码显示,是在Edit控件的KeyPressFcn回调函数中,通过设置Edit控件的‘String’属性完成。但在此过程中,密码框始终认定用户没有进行任何输入,光标位置一直重复出现(默认居中),因此会出现光标一直显示在星号左侧的现象;在键入密码的过程中,密码以‘UserData’的形式进行存储。选中清空密码框后,上次键入的密码数据‘UserData’和存储星号的‘String’属性并未清空,因此在重新键入密码时会出现星号数量与键入的密码数量不符的现象;将Edit控件的‘Enable’属性设置为‘Inactive’后,Edit控件处于闲置状态,无法键入字符。
由于MATLAB未设计专门的密码框,加之Edit控件本身的局限性。在实现密码框功能时,便出现了以上的问题。关于密码框的设计,书中所讲述的实现方式依旧能够参考使用。在实现书中讲述的密码框功能后,便自作主张,在Edit控件的KeyPressFcn回调函数中增加了删除所有星号和清空密码的功能。在选中密码框的内容后,按下删除键(Delete)即可删除所有星号和清空密码,其具体代码如下function password_KeyPressFcn(hObject, eventdata, handles)
% hObject handle to password (see GCBO)
% eventdata structure with the following fields (see MATLAB.UI.CONTROL.UICONTROL)
%Key: name of the key that was pressed, in lower case
%Character: character interpretation of the key(s) that was pressed
%Modifier: name(s) of the modifier key(s) (i.e., control, shift) pressed
% handles structure with handles and user data (see GUIDATA)
c = eventdata.Character; % 获取用户键入的字符
if isstrprop(c, 'graphic') % 键入图形字符执行
%% 多显示一个星号,且将键入的字符存入编辑框password的UserData中
set(handles.password, 'userdata', [get(handles.password, 'userdata'), c],...
'String', [get(handles.password, 'String'), '*']);
else % 键入非图形字符执行
val = double(c); % 获取