Bonjour, je suis en train d'apprendre à programmer avec C# VS 2010 EE et je suis en train de faire une application pour remplir un formulaire préimprimé. Ce formulaire a plusieurs emplacements dans des coordonnées différentes. Trois des cases du papier sont des cases multilignes de 5" de large x 2" de haut.
J'ai déjà créé le formulaire Windows avec un TextBox
pour chaque place sur le formulaire papier.
En effet, lorsque je saisis des informations dans ces boîtes de texte multilignes, j'ai besoin de savoir combien de lignes il reste sur le papier pour saisir davantage de texte, et aussi quand je dois arrêter de taper parce qu'il n'y a plus d'espace disponible dans la boîte préimprimée.
J'ai fait beaucoup de recherches, mais tout ce que j'ai trouvé concerne la mesure à l'écran, qui ne correspond pas au résultat final sur le papier.
En d'autres termes, j'ai besoin de savoir comment déterminer les dimensions de la chaîne de caractères sur le papier pendant qu'elle est saisie dans les boîtes de texte et de les comparer à l'espace disponible sur le formulaire préimprimé afin de pouvoir m'arrêter avant qu'elle ne dépasse le bord inférieur de la boîte sur le papier.
La première case du papier mesure 5" de largeur sur 2" de hauteur et commence à ". new RectangleF(60.0F, 200.0F, 560.0F, 200.0F)
". Je comprends que ces chiffres correspondent à des centièmes de pouce.
Tout cela, en tenant compte du fait que je ne peux pas limiter les TextBox par quantité de caractères parce que tous les caractères n'occupent pas le même espace, par exemple H != I;
M != l;
etc.
Merci d'avance pour votre aide. Aujourd'hui, le 05 septembre 2011, sur la base de vos commentaires et suggestions, j'ai modifié le code pour utiliser Graphics.MeasureString .
Voici le code que j'ai maintenant avec le Graphics.MeasureString et une seule richTextBox : Fonctionne parfaitement à partir de l'événement printDocument1_PrintPage, mais je n'ai aucune idée de comment le faire fonctionner à partir de l'événement richTextBox1_TextChanged .
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;//Needed for the PrintDocument()
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Printing
{
public partial class Form1 : Form
{
private Font printFont1;
string strPrintText;
public Form1()
{
InitializeComponent();
}
private void cmdPrint_Click(object sender, EventArgs e)
{
try
{
PrintDocument pdocument = new PrintDocument();
pdocument.PrintPage += new PrintPageEventHandler
(this.printDocument1_PrintPage);
pdocument.Print();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public void printDocument1_PrintPage (object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
strPrintText = richTextBox1.Text.ToString();
printFont1 = new Font("Times New Roman", 10); //I had to remove this line from the btnPrintAnexo1_Click
Graphics g = e.Graphics;
StringFormat format1 = new StringFormat();
RectangleF rectfText;
int iCharactersFitted, iLinesFitted;
rectfText = new RectangleF(60.0F, 200.0F, 560.0F, 200.0F);
// The following e.Graphics.DrawRectangle is
// just for debuging with printpreview
e.Graphics.DrawRectangle(new Pen(Color.Black, 1F),
rectfText.X, rectfText.Y, rectfText.Width, rectfText.Height);
format1.Trimming = StringTrimming.Word; //Word wrapping
//The next line of code "StringFormatFlags.LineLimit" was commented so the condition "iLinesFitted > 12" could be taken into account by the MessageBox
// Use next line of code if you don't want to show last line, which will be clipped, in rectangleF
//format1.FormatFlags = StringFormatFlags.LineLimit;
//Don't use this next line of code. Some how it gave me a wrong linesFilled
//g.MeasureString(strPrintText, font, rectfFull.Size,
//StringFormat.GenericTypographic, out iCharactersFitted, out iLinesFilled);
//Use this one instead:
//Here is where we get the quantity of characters and lines used
g.MeasureString(strPrintText, printFont1, rectfText.Size, format1, out iCharactersFitted, out iLinesFitted);
if (strPrintText.Length == 0)
{
e.Cancel = true;
return;
}
if (iLinesFitted > 12)
{
MessageBox.Show("Too many lines in richTextBox1.\nPlease reduce text entered.");
e.Cancel = true;
return;
}
g.DrawString(strPrintText, printFont1, Brushes.Black, rectfText, format1);
g.DrawString("iLinesFilled = Lines in the rectangle: " + iLinesFitted.ToString(), printFont1, Brushes.Black,
rectfText.X, rectfText.Height + rectfText.Y);
g.DrawString("iCharactersFitted = Characters in the rectangle: " + iCharactersFitted.ToString(), printFont1, Brushes.Black,
rectfText.X, rectfText.Height + rectfText.Y + printFont1.Height);
}
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
//***I don’t know what to type here.***
if (iLinesFitted == 13)
{
MessageBox.Show("Too many lines in richTextBox1.\nPlease erase some characters.");
}
}
private void cmdPrintPreview_Click(object sender, EventArgs e)
{
printPreviewDialog1.ShowDialog();
}
private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
// strPrintText = richTextBox1.Text;
}
}
}