Hi, I am learning programming with C # VS 2010 EE and Im creating an application to fill out a pre-printed form. This form has several places in different coordinates. Three boxes on paper are multi-line 5-inch boxes measuring 5 x W2.
I have already created a window form with one TextBox for each place in paper form.
The fact is that when I enter information into these multiline text fields, I need to know how many lines are left on the paper to enter more text, and also when to stop printing, because the PrePrinted field has more free space.
I did a lot of searching, but all I found was a measurement on the screen that did not match the final result on paper.
In other words, I need to know how to find out what the string measurements on paper will be when they are inserted into text fields and compare them with the space available in the PrePrinted form, so I can stop it going through the bottom border of the field on paper.
The first box on paper is 5 inches high by 2 inches wide, starting with " new RectangleF(60.0F, 200.0F, 560.0F, 200.0F) ." I understand that these numbers are hundredths of an inch.
All this, taking into account that I cannot limit the text fields to the number of characters, because not all characters occupy the same space, for example, H != I; M != l; etc.
Thank you in advance for your help. Today, Sep 05, 2011, based on your comments and suggestions, Ive changed the code to use Graphics.MeasureString.
This is the code that I have now with Graphics.MeasureString and only one richTextBox: Works fine with the printDocument1_PrintPage event, but I don't know how to get it to work from the richTextBox1_TextChanged event.
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; } } }