Question

Existe-t-il un moyen de changer la taille d’onglet par défaut dans un .NET RichTextBox? Il semble actuellement être réglé à l'équivalent de 8 espaces, ce qui est un peu grand à mon goût.

Modifier: pour clarifier, je souhaite définir la valeur globale par défaut de " \ t " affiche comme 4 espaces pour le contrôle. D'après ce que je peux comprendre, la propriété SelectionTabs nécessite de sélectionner tout le texte en premier, puis les largeurs de tabulation via le tableau. Je le ferai s'il le fallait, mais je préférerais simplement changer le défaut global une fois, si possible, pour éviter de le faire à chaque fois.

Était-ce utile?

La solution

Vous pouvez le définir en définissant le SelectionTabs propriété.

private void Form1_Load(object sender, EventArgs e)
{
    richTextBox1.SelectionTabs = new int[] { 100, 200, 300, 400 };
}

UPDATE:
La séquence compte ....

Si vous définissez les onglets avant l'initialisation du texte du contrôle, il n'est pas nécessaire de sélectionner le texte avant de définir les onglets.

Par exemple, dans le code ci-dessus, cela conservera le texte avec les tabulations d'origine à 8 espaces:

richTextBox1.Text = "\t1\t2\t3\t4";
richTextBox1.SelectionTabs = new int[] { 100, 200, 300, 400 };

Mais cela utilisera les nouveaux:

richTextBox1.SelectionTabs = new int[] { 100, 200, 300, 400 };
richTextBox1.Text = "\t1\t2\t3\t4";

Autres conseils

Winforms n'a pas de propriété permettant de définir la taille de tabulation par défaut d'un RichTexBox avec un seul numéro, mais si vous êtes prêt à creuser dans le RTF de la zone de texte enrichi et à le modifier, vous pouvez définir un paramètre. utilisation appelée: "\ deftab". Le nombre indique ensuite le nombre de twips (1 point = 1/72 pouce = 20 twips). Le fichier RTF résultant avec une taille d’onglet standard de 720 twips pourrait ressembler à ceci:

{\rtf1\ansi\ansicpg1252\deff0\deflang2057\deftab720{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}
\viewkind4\uc1\pard\f0\fs41
1\tab 2\tab 3\tab 4\tab 5\par
}

Si vous devez convertir des twips en pixels, utilisez ce code inspiré de Convertir des pixels en points :

int tabSize=720;
Graphics g = this.CreateGraphics();
int pixels = (int)Math.Round(((double)tabSize) / 1440.0 * g.DpiX);
g.Dispose();

Si vous avez une boîte RTF utilisée uniquement pour afficher (en lecture seule) du texte à pas fixe, le plus simple serait de ne pas jouer avec les tabulations. Il suffit de les remplacer par des espaces.

Si vous souhaitez que l'utilisateur puisse saisir quelque chose et utiliser cette touche de tabulation pour avancer, vous pouvez également capturer la touche de tabulation en remplaçant OnKeyDown () et imprimer des espaces à la place.

C'est étrange que personne n'ait proposé cette méthode depuis tout ce temps)

Nous pouvons hériter de RichTextBox et réécrire le gestionnaire CmdKey ( ProcessCmdKey )
Il se présentera ainsi:

public class TabRichTextBox : RichTextBox
{
    [Browsable(true), Category("Settings")]
    public int TabSize { get; set; } = 4;

    protected override bool ProcessCmdKey(ref Message Msg, Keys KeyData)
    {

        const int WM_KEYDOWN = 0x100;       // https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-keydown
        const int WM_SYSKEYDOWN = 0x104;    // https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-syskeydown
        // Tab has been pressed
        if ((Msg.Msg == WM_KEYDOWN || Msg.Msg == WM_SYSKEYDOWN) && KeyData.HasFlag(Keys.Tab))
        {
            // Let's create a string of spaces, which length == TabSize
            // And then assign it to the current position
            SelectedText += new string(' ', TabSize);

            // Tab processed
            return true;
        }
        return base.ProcessCmdKey(ref Msg, KeyData);
    }
}

Maintenant, lorsque vous appuierez sur Tab , un nombre spécifié d'espaces sera inséré dans la zone de contrôle au lieu de \ t

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top