2017-01-17 3 views
0

J'essaye de créer une boîte de rectangle sur l'écran dans PTB dans lequel le participant peut taper le texte qui est emballé dans cette boîte. Je voudrais donc que l'entrée de chaîne soit dessinée à l'écran en tapant une boîte rectangulaire dans laquelle la saisie de texte est encapsulée pour éviter qu'elle ne continue en dehors de la bordure de cette boîte. J'ai cherché pendant un certain temps maintenant et n'ai rien trouvé qui fonctionne ou quelqu'un qui a fait cela auparavant. Je suppose que je pourrais négliger quelque chose de très simple.Comment faire apparaître une entrée de participant à l'écran et l'envelopper (Psychtoolbox)

J'ai essayé d'utiliser:

% Textbox 
Screen('FrameRect',window, white, [300 300 1600 600],4);  
message = [‘Your comments: ‘]; 
replySubj = Ask(window, message, white, black, 'GetChar',[300 225 1600 600]); 

L'entrée de réponse est bien tiré à l'écran lors de la frappe, mais seulement sur une ligne qui n'est pas enveloppé quand je tends le côté de la boîte, ou même mon écran. Est-ce que c'est un moyen d'enrouler le texte (par exemple en intégrant WrapString.m) afin qu'il reste dans un rectangle spécifié à l'écran, et continue vers une nouvelle ligne si le texte est trop long pour une ligne?

Toute aide est très appréciée.

Répondre

0

En regardant la fonction GetEchoString, il effectue les opérations suivantes sur chaque coup de caractères (au mieux de ma compréhension de la façon dont l'affichage est géré):

  • si elle est Ctrl-C, Enter ou Return: sortie ;
  • , s'il s'agit de Backspace, exécutez la commande pour redessiner la chaîne complète précédente (invite + entrée utilisateur) avec la même couleur que l'arrière-plan pour l'effacer; puis supprime le dernier caractère de la chaîne complète stockée; Sinon, ajoutez le caractère à la chaîne complète stockée.

puis exécutez la commande pour dessiner la chaîne complète mise à jour résultant de la couleur spécifiée, et enfin mettre à jour l'écran suivant les commandes précédentes, avec l'option dontclearset-1 (dessin supplémentaire, voir Screen('Flip', windowPtr, 0, 1) appel).

Pour ajouter des capacités d'emballage, on peut ainsi modifier GetEchoString comme suit:

  • commentaire sur les commandes de redessiner lorsque Backspace est frappé, la mise à jour simplement la chaîne stockée (voir ci-dessous);
  • ajouter un appel à WrapString sur la chaîne mise à jour pour l'envelopper;
  • utilisé DrawFormattedText pour émettre une commande pour afficher la chaîne encapsulée;
  • enfin, appelez Screen('Flip', windowPtr) qui est mise à jour l'écran avec dontclearset à 0 (par défaut).

La partie pertinente de la fonction sont maintenant ainsi:

% 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 et vLineSpacing sont à définir en fonction de vos besoins. Ceci prendra en charge l'enrobage horizontal du texte tout en maintenant la fonction Backspace active. Notez cependant que vous pouvez toujours déborder verticalement si tout l'écran est rempli.