我正试图在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-C
、Enter
或Return
:退出 - 如果是
Backspace
,则发出命令,重新绘制与背景颜色相同的前一个完整字符串(提示+用户输入)以将其擦除;则从所存储的完整字符串中移除最后一个字符 - 否则将该字符附加到存储的完整字符串中
然后发出命令,以指定的颜色绘制结果更新的完整字符串,最后根据前面的命令更新屏幕,使用选项dontclearset
到1
(增量绘制,参见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
其中maxNumChar
和vLineSpacing
将根据您的需要进行定义。
这将处理文本的水平换行,同时保持Backspace
函数的工作状态。但是请注意,如果整个屏幕都被填满了,您仍然可能垂直溢出。