11
votes

Mesurer la chaîne à l'intérieur du contrôle RichtextBox

Quelqu'un peut-il s'il vous plaît expliquer comment j'allumerais la mesure de la chaîne à l'intérieur d'un contrôle RichTextbox afin que je puisse redimensionner automatiquement la commande Richtextbox en fonction de son contenu?

merci

EDIT:

J'y ai pensé et, étant donné que la réponse ci-dessous ne fonctionnera pas s'il existe différentes polices de la commande Richtextbox, que si, je pourrais obtenir les coordonnées en haut de gauche de la commande RichTextBox, puis obtenir le fond De bonnes coordonnées de la dernière ligne de texte à l'intérieur du RTB. Cela me donnerait essentiellement la largeur et la hauteur de la chaîne à l'intérieur du contrôle RichTextBox. Est-ce possible? Ou est-ce une mauvaise idée de le faire de cette façon?


0 commentaires

6 Réponses :


0
votes

Vous pouvez mesurer une chaîne en appelant textrenderer.measuretext .

Toutefois, si le texte contient plusieurs polices, cela ne fonctionnera pas.

edit : vous recherchez le getPositionFrromchaindex méthode.
Notez que s'il y a plusieurs lignes, vous devez prendre le maximum des coordonnées X du dernier caractère de chaque ligne.


2 commentaires

Merci. Je ne comprends pas bien cette page. Pourquoi cela attire-t-il du texte? Peut-il simplement m'envoyer une valeur de largeur et de hauteur afin que je puisse réinitialiser la taille de la nouvelle taille?


textrenderer.metsetext ne dessine rien; Il renvoie simplement la taille du texte en pixels.



3
votes

En supposant que quelqu'un tape dans la commande, vous pouvez utiliser un événement pour déclencher chaque fois qu'un caractère est entré (compteur d'incrément) et décrément lorsqu'il est supprimé. Cela vous donnerait un véritable compte.

Edit:

Avez-vous essayé de régler la hauteur? xxx

ou vous pouvez le faire en utilisant la largeur: xxx


4 commentaires

C'est actuellement ce que je fais, bien que vous ne puissiez pas prendre en compte les styles / tailles de police de cette façon, et éventuellement, le RTB ne sera pas en mesure de suivre et que le texte déborde


Aucune infraction, mais cela produit des résultats très laids. Il doit y avoir un moyen de le faire sans ressembler à la RichTextbox est sur le point d'exploser sur mon moniteur.


Hmm, il semblait bien fonctionner ici mais je n'applique pas de styles de police


Cela pourrait fonctionner pour des boîtes de texte simples, mais cela ne fonctionne pas pour les richtextboxes qui peuvent avoir des mots en gras, plusieurs polices utilisées et plusieurs tailles de police.



3
votes

Essayez appeler getPreferredSize (taille.empty ) . Il est défini dans la classe de contrôle et si la nervation de la propriété de RichtextboxControl, devrait vous donner ce que vous recherchez.

Si vous passez quelque chose d'autre que size.empty dans la méthode, il utilisera cette valeur comme une contrainte maximale. En utilisant la taille.empty signifie que la taille potentielle est sans bornes.


2 commentaires

Vous pouvez même l'appeler avec la largeur getpreferredsize (nouvelle taille (largeur, 0)) et vous pouvez obtenir la hauteur de la taille de retour de cet appel.


Cela ne fonctionne pas. La hauteur et la largeur renvoyées par GetPerPerredSize sont à la fois trop courtes.



7
votes

Mettez le code suivant dans le ContenuResized Code> événement:

Private Sub rtb_ContentsResized(ByVal sender As Object, ByVal e As System.Windows.Forms.ContentsResizedEventArgs) Handles txtQuestion.ContentsResized
        Dim h = e.NewRectangle.Height, w = e.NewRectangle.Width
        h = Math.Max(h, sender.Font.Height)
        h = Math.Min(h, Me.ClientSize.Height - 10 - sender.Top)
        h += sender.Height - sender.ClientSize.Height + 1
        sender.Height = h
End Sub


2 commentaires

ContenuSentSisized et E.Newrectangle Est-ce que l'astuce m'a fait. Les autres suspects habituels par exemple Autosize , GETPREFERREDSIZE Ne semble pas fonctionner correctement pour Richtextbox .


Cela ne fonctionne pas. La hauteur se termine trop courte et même si je modifiez cela pour définir Sender.Width = w, la largeur ne change pas du tout.



0
votes

J'ai trouvé une solution pour les problèmes de hauteur de la boîte de texte riche. Je l'ai modifié A pour une utilisation générale.

Créez des structs suivantes dans votre application .... strong> P>

private int CalculateRichTextHeight(string richText) {
            int height = 0;
            RichTextBox richTextBox = new RichTextBox();
            richTextBox.Rtf = richText;
            richTextBox.Height = this.Bounds.Height;
            richTextBox.Width = this.Bounds.Width;
            richTextBox.WordWrap = false;
            int nHeight = 0;
            int nMin = 0, nMax = 0;

            SCROLLBARINFO psbi = new SCROLLBARINFO();
            psbi.cbSize = Marshal.SizeOf(psbi);

            richTextBox.Height = 10;
            richTextBox.ScrollBars = RichTextBoxScrollBars.Vertical;

            int nResult = GetScrollBarInfo(richTextBox.Handle, OBJID_VSCROLL, ref psbi);
            if (psbi.rgstate[0] == 0) {
                GetScrollRange(richTextBox.Handle, SB_VERT, out nMin, out nMax);
                height = (nMax - nMin);
            }

            return height;
        }


1 commentaires

Cela ne fonctionne pas. La hauteur finit toujours trop courte.



0
votes

Ajoutez sur la bonne réponse de Bathineni:

Contexte: Je devais mesurer la hauteur de sortie RTF pour le rendu sur papier et que j'ai des en-têtes de page dynamique personnalisés, je devais contrôler la pagination). P>

(richtextbox.getlinefrrromchaindex laissez-moi baisser à cause de la RTF complexe; y compris des lignes et des tables multi-colonnes avec WordWrap). em> p>

Tous fonctionnaient bien, jusqu'à ce que quelqu'un d'autre ait utilisé mon application avec le Windows redoutables "Faites du texte et d'autres éléments plus grands ou plus petits" (paramètres DPI.) - En bref, mesurez maintenant des polices de taille plus grandes, il vissait les calculs de la page de la page. (L'imprimante a toujours rendu le texte et les colonnes correctement - seules les longueurs de la page étaient désormais toutes erronées.) p>

Seule la différence DPI a échoué comme dans un texte plus important ne correspondait pas correctement dans la source RTF TX et CellX valeurs . P>

Quoi qu'il en soit, au cas où d'autres font des choses folles similaires et des erreurs ont eu lieu avec les mods suivants (éventuellement très peu) à la méthode Bathineni CalculatedexTheight: P>

lines = height / (int)(16 * (dpix / 96))


0 commentaires