0

我正在尝试在 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),使其停留在屏幕上的指定矩形内,如果文本对于一行来说太长,则继续换行?

很感谢任何形式的帮助。

4

1 回答 1

0

查看该GetEchoString功能,它会在每次击字符时执行以下操作(据我所知,如何管理显示):

  • 如果是Ctrl-C, Enter, 或Return: 退出;
  • 如果是Backspace,则发出命令以与背景相同的颜色重新绘制先前的完整字符串(提示+用户输入)以将其擦除;然后从存储的完整字符串中删除最后一个字符;
  • 否则将字符附加到存储的完整字符串。

然后发出命令以指定颜色绘制生成的更新后的完整字符串,最后按照前面的命令更新屏幕,并带有选项dontclearset1增量绘图,参见Screen('Flip', windowPtr, 0, 1)调用)。

要添加包装功能,我们可以修改GetEchoString如下:

  • 击中时注释掉重新绘制命令Backspace,只需更新存储的字符串(见下文);
  • WrapString在更新的字符串上添加一个调用来包装它;
  • 用于DrawFormattedText发出命令以显示包装后的字符串;
  • 最后,调用Screen('Flip', windowPtr)将屏幕更新dontclearset0(默认)。

该功能的相关部分现在是:

% 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功能正常工作。但是请注意,如果整个屏幕都被填满,您仍然可以垂直溢出。

于 2017-08-04T10:34:53.763 回答