Существует способ достижения этого, но (i) не непосредственно в GUIDE, и (ii) даже в чистом MATLAB. Это решение основано на недокументированных базовых java-свойствах блока MATLAB edit
.
Для того, чтобы получить доступ к этим объектам, сначала необходимо скачать утилиту finjobj
из обмена файлами.
Вооружившись этим, следующий код отлично работает на MATLAB R2015a, вам, возможно, придется настраивать или использовать скрипты для других версий MATLAB.
Код для demo_editbox_interception.m
:
function h = demo_editbox_interception
% create minimalistic text box
h.fig = figure('Toolbar','none','Menubar','none') ;
h.ht = uicontrol('style','edit','Position',[20 20 300 30],...
'String','This is a multi-word test string');
% find the handle of the underlying java object
h.jt = findjobj(h.ht) ;
% disable edition of the java text box
h.jt.Editable = 0 ;
% => This leaves you with a text box where you can select all or part of
% the text present, but you cannot modify the text.
%% Now add copy functionality:
% choose which functionality you want from the options below:
% set(h.ht,'ButtonDownFcn',@copy_full_string)
set(h.ht,'ButtonDownFcn',{@copy_selection,h.jt})
function str = copy_full_string(hobj,~)
% this function will copy the ENTIRE content of the edit box into the
% clipboard. It does NOT rely on the undocumented java properties
str = get(hobj,'String') ;
clipboard('copy',str)
disp(['String: "' str '" copied into the clipboard.'])
function str = copy_selection(hobj,evt,jt)
% this function will copy the SELECTED content of the edit box into the
% clipboard. It DOES rely on the undocumented java properties
str = jt.SelectedText ;
clipboard('copy',str)
disp(['String: "' str '" copied into the clipboard.'])
Вы можете увидеть его в действие. Выделите текст с левой кнопкой мыши, и огонь обратного вызова (копию) с помощью правой кнопки:
Для правой кнопкой мыши поведения, вы должны кодировать его самостоятельно (например, добавить [ 'uicontextmenu' ] (https://mathworks.com/help/matlab/ref/uicontextmenu.html) в текстовое поле). Для вашего другого вопроса, если ваша конечная цель состоит в том, чтобы просто скопировать полный текст в буфер обмена, есть хороший трюк, описанный здесь (https://mathworks.com/help/matlab/ref/uicontrol.html#f52- 578590) (в разделе «наконечник»). В противном случае нет простого способа отредактировать/запретить модификацию текста на лету, в Matlab будет срабатывать только событие (позволяющее вам взаимодействовать) после того, как фокус покинет текстовое поле (или нажмите клавишу ввода). – Hoki
Неактивный editbox - это способ пойти imho. Вы можете изменить сочетания клавиш в виде окна в «Настройки >> MATLAB >> Клавиатура >> Ярлыки >> Активные настройки: Windows Default Set' (вероятно, это« Emact Default Set »на данный момент). –