我试图在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),以便它停留在屏幕上指定的矩形中,如果文本对一行太长,则继续使用新行吗?
任何帮助都是非常感谢的。
发布于 2017-08-04 10:34:53
查看GetEchoString
函数,它对每个字符执行以下操作(据我所知,显示是如何管理的):
Ctrl-C
、Enter
或Return
:退出;Backspace
,发出命令重新绘制前一个完整字符串(提示+用户输入),其颜色与背景相同,然后从存储的完整字符串中删除最后一个字符;然后发出命令,以指定的颜色绘制得到的更新后的完整字符串,最后按照前面的命令更新屏幕,并选择dontclearset
到1
(增量绘图,cf )。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
函数正常工作。但是请注意,如果填充了整个屏幕,您仍然可以垂直溢出。
https://stackoverflow.com/questions/41693336
复制相似问题