Как сделать так, чтобы вход участника отображался на экране и был обернут (Psychtoolbox)
Я пытаюсь создать прямоугольник на экране в PTB, где участник может вводить текст, заключенный в это поле. Поэтому я хотел бы, чтобы ввод строки выводился на экране при наборе текста в прямоугольном поле, где ввод текста обернут, чтобы избежать продолжения за пределами этого поля. Я искал некоторое время и не нашел ничего, что работает или кто-то, кто делал это раньше. Я предполагаю, что я мог бы пропустить что-то очень простое.
Я пытался с помощью:
% Textbox
Screen('FrameRect',window, white, [300 300 1600 600],4);
message = [‘Your comments: ‘];
replySubj = Ask(window, message, white, black, 'GetChar',[300 225 1600 600]);
Ответный ввод хорошо отображается на экране во время набора текста, но только на одной строке, которая не оборачивается, когда я достигаю края поля, или даже моего экрана. Являются ли они способом обтекания текста (например, путем интеграции WrapString.m), чтобы он оставался внутри указанного прямоугольника на экране и переходил к новой строке, если текст слишком длинный для одной строки?
Любая помощь очень ценится.
1 ответ
Глядя на GetEchoString
при каждом ударе персонажа выполняет следующие функции (насколько я понимаю, как управляется дисплей):
- если это
Ctrl-C
,Enter
, или жеReturn
: выход; - если это
Backspace
, выполните команду, чтобы заново нарисовать предыдущую полную строку (приглашение + пользовательский ввод) того же цвета, что и фон, чтобы стереть ее; затем удалите последний символ из сохраненной полной строки; - еще добавить символ к сохраненной полной строке.
Затем выполните команду, чтобы нарисовать полученную обновленную полную строку в указанном цвете, и, наконец, обновите экран, следуя предыдущим командам, с опцией dontclearset
в 1
(инкрементальный рисунок, ср. Screen('Flip', windowPtr, 0, 1)
вызов).
Чтобы добавить возможности упаковки, мы можем таким образом изменить GetEchoString
следующее:
- закомментируйте команды перерисовки, когда
Backspace
ударил, просто обновив сохраненную строку (см. ниже); - добавить вызов
WrapString
на обновленной строке, чтобы обернуть ее; - используемый
DrawFormattedText
выдать команду для отображения переносимой строки; - наконец позвони
Screen('Flip', windowPtr)
это обновить экран сdontclearset
в0
(дефолт).
Соответствующая часть функции теперь такова:
% adapted from PTB3 GetEchoString
while true
if useKbCheck
char = GetKbChar(varargin{:});
else
char = GetChar;
end
if isempty(char)
string = '';
break;
end
switch (abs(char))
case {13, 3, 10}
% ctrl-C, enter, or return
break;
case 8
% backspace
if ~isempty(string)
% Remove last character from string:
string = string(1:length(string)-1);
end
otherwise
string = [string, char];
end
output = [msg, ' ', string];
output=WrapString(output,maxNumChar);
DrawFormattedText(windowPtr,output,x,y,textColor,[],0,0,vLineSpacing);
Screen('Flip',windowPtr);
end
куда maxNumChar
а также vLineSpacing
должны быть определены в зависимости от ваших потребностей.
Это позаботится о горизонтальном переносе текста, сохраняя при этом Backspace
функция работает. Обратите внимание, что вы все равно можете переполниться по вертикали, если весь экран заполнен