我正在尝试在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),使其保持在屏幕上的指定矩形内,如果文本对于一行太长,则继续使用新行吗?
非常感谢任何帮助。
答案 0 :(得分:0)
查看GetEchoString
函数,它会在每次角色攻击时执行以下操作(据我所知,我最了解如何管理显示):
Ctrl-C
,Enter
或Return
:退出; Backspace
,则发出命令以重新绘制与背景颜色相同的前一个完整字符串(提示+用户输入)以将其删除;然后从存储的完整字符串中删除最后一个字符; 然后发出命令以指定颜色绘制生成的更新完整字符串,最后使用选项dontclearset
到1
按照上一个命令更新屏幕(增量图,参见{ {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
功能正常工作。但请注意,如果整个屏幕都已填满,您仍然可以垂直溢出。