Как сделать так, чтобы вход участника отображался на экране и был обернут (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 функция работает. Обратите внимание, что вы все равно можете переполниться по вертикали, если весь экран заполнен

Другие вопросы по тегам