如何使参与者的输入显示在屏幕上并被包装(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),使其保持在屏幕上指定的矩形内,如果文本太长而无法换行,则继续换行?

非常感谢您的帮助。

查看GetEchoString函数,它在每次字符敲击时都会执行以下操作(据我所知,它是如何管理显示的):

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

然后发出命令,以指定的颜色绘制结果更新的完整字符串,最后根据前面的命令更新屏幕,使用选项dontclearset1(增量绘制,参见Screen('Flip', windowPtr, 0, 1)调用)。

为了增加包装功能,我们可以修改GetEchoString如下:

  • 点击Backspace时注释掉重新绘制命令,只需更新存储的字符串(见下文)
  • 在更新后的字符串上添加对WrapString的调用以对其进行包装
  • 使用CCD_ 12发出命令显示被包裹的字符串
  • 最后,调用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

其中maxNumCharvLineSpacing将根据您的需要进行定义。

这将处理文本的水平换行,同时保持Backspace函数的工作状态。但是请注意,如果整个屏幕都被填满了,您仍然可能垂直溢出。

相关内容

  • 没有找到相关文章

最新更新