Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Stampanje teksta iz RichTextbox-a

[es] :: .NET :: Stampanje teksta iz RichTextbox-a

[ Pregleda: 2276 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

drgajic12
Beograd

Član broj: 51770
Poruke: 165
95.180.43.*



+2 Profil

icon Stampanje teksta iz RichTextbox-a29.05.2009. u 20:36 - pre 152 meseci
Imam :
string[] linije;
int linijastampano;

U BeginPrint stavim
{
char[] split = { '\n' };
linije = richTextBox1.Text.Split(split);
}
U PrintPage imam:
{
int x = 10;
int y = 10;
Font trenutnifont;
trenutnifont = richTextBox1.SelectionFont;
Color boja = richTextBox1.SelectionColor;
Brush cetka=new SolidBrush(boja);

while (linijastampano < linije.Length)
{
e.Graphics.DrawString(linije[linijastampano++], trenutnifont,cetka, x,y);
y += 15;
if (y >= e.PageBounds.Height - 80)
{
e.HasMorePages = true;
return;
}
}
linijastampano = 0;
e.HasMorePages = false;
}

Problem je sto sa ovim kodom ako imam u richtextbox-u tekst koji je pisan razlicitim fontovima,razlicitih je boja,neki redovi su centrirani,on mi stampa uvek od pocetka-od leve ivice,znaci od x=10,jednim fontom,jednom bojom.
Kako da resim ovaj problem,da mi se stampa tekst onakav kakav je u richtextbox-u?
Najbitnije mi je da mi uvlaci tekst onako kako je uvucen u richtextbox-u,kada se centrira i tako to.
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
93.86.85.*

Jabber: DarkMan


Profil

icon Re: Stampanje teksta iz RichTextbox-a29.05.2009. u 21:59 - pre 152 meseci
Mislim da bi ti mnogo jednostavnije bilo da probas nesto ovako:
http://www.codeguru.com/csharp...ols/richtext/article.php/c4781
 
Odgovor na temu

drgajic12
Beograd

Član broj: 51770
Poruke: 165
95.180.43.*



+2 Profil

icon Re: Stampanje teksta iz RichTextbox-a29.05.2009. u 23:12 - pre 152 meseci
Probao sam,radi dobro,znaci samo u printDocument1_PrintPage stavim
{
int zadnjikarakter = richTextBoxEx1.Text.Length;
richTextBoxEx1.FormatRange(false, e, 0, zadnji);
}
Jel treba jos nesto da se napise?
Ovaj prvi parametar ne znam za sta sluzi,jel ga treba staviti na true ili false?
I jos jedno pitanje,kako da mu promenim TOP marginu tj. Y kordinatu od koje da pocne da stampa,hocu da je povecam,zato sto prvo hocu da istampam neki fiksan tekst,pa nize da pocne da se stampa ono sto je u richTextBoxEx1?




[Ovu poruku je menjao drgajic12 dana 30.05.2009. u 00:37 GMT+1]

[Ovu poruku je menjao drgajic12 dana 30.05.2009. u 01:27 GMT+1]
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
93.86.85.*

Jabber: DarkMan


Profil

icon Re: Stampanje teksta iz RichTextbox-a30.05.2009. u 12:01 - pre 152 meseci
Ja sam za svoje potrebe napravio malo drugacije. Sledi primer u kojem imas i podesavanje margina, a sto se tice dodavanja teksta mozes pre same stampe dodati predefinisani tekst u samu richtext kontrolu.

Code:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsApplication1
{
    static class Program
    {

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            PrintableRichTextBox rich = new PrintableRichTextBox();
            rich.LoadFile(@"c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\EULA.rtf");

            Form form = new Form();
            PrintPreviewControl preview = new PrintPreviewControl();
            preview.Dock = DockStyle.Fill;
            preview.Document = rich.CreatePrintDocument();
            preview.Document.DefaultPageSettings.Margins = new Margins(20, 20, 20, 20);
            form.Controls.Add(preview);
            form.WindowState = FormWindowState.Maximized;
            form.ShowDialog();
            form.Dispose();
        }
    }

    [ToolboxItem(true)]
    [ToolboxBitmap(typeof(TextBox))]
    public class PrintableRichTextBox: RichTextBox
    {
        //Convert the unit used by the .NET framework (1/100 inch) 
        //and the unit used by Win32 API calls (twips 1/1440 inch)
        private const double anInch = 14.4;

        [StructLayout(LayoutKind.Sequential)]
        private struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct CHARRANGE
        {
            public int cpMin;         //First character of range (0 for start of doc)
            public int cpMax;           //Last character of range (-1 for end of doc)
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct FORMATRANGE
        {
            public IntPtr hdc;             //Actual DC to draw on
            public IntPtr hdcTarget;       //Target DC for determining text formatting
            public RECT rc;                //Region of the DC to draw to (in twips)
            public RECT rcPage;            //Region of the whole DC (page size) (in twips)
            public CHARRANGE chrg;         //Range of text to draw (see earlier declaration)
        }

        private const int WM_USER = 0x0400;
        private const int EM_FORMATRANGE = WM_USER + 57;

        [DllImport("USER32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);

        // Render the contents of the RichTextBox for printing
        //    Return the last character printed + 1 (printing start from this point for next page)
        public int Print(int charFrom, int charTo, PrintPageEventArgs e)
        {
            //Calculate the area to render and print
            RECT rectToPrint;
            rectToPrint.Top = (int)(e.MarginBounds.Top * anInch);
            rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch);
            rectToPrint.Left = (int)(e.MarginBounds.Left * anInch);
            rectToPrint.Right = (int)(e.MarginBounds.Right * anInch);

            //Calculate the size of the page
            RECT rectPage;
            rectPage.Top = (int)(e.PageBounds.Top * anInch);
            rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch);
            rectPage.Left = (int)(e.PageBounds.Left * anInch);
            rectPage.Right = (int)(e.PageBounds.Right * anInch);

            IntPtr hdc = e.Graphics.GetHdc();

            FORMATRANGE fmtRange;
            fmtRange.chrg.cpMax = charTo;                //Indicate character from to character to 
            fmtRange.chrg.cpMin = charFrom;
            fmtRange.hdc = hdc;                    //Use the same DC for measuring and rendering
            fmtRange.hdcTarget = hdc;              //Point at printer hDC
            fmtRange.rc = rectToPrint;             //Indicate the area on page to print
            fmtRange.rcPage = rectPage;            //Indicate size of page

            IntPtr res = IntPtr.Zero;

            IntPtr wparam = IntPtr.Zero;
            wparam = new IntPtr(1);

            //Get the pointer to the FORMATRANGE structure in memory
            IntPtr lparam = IntPtr.Zero;
            lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange));
            Marshal.StructureToPtr(fmtRange, lparam, false);

            //Send the rendered data for printing 
            res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam);

            //Free the block of memory allocated
            Marshal.FreeCoTaskMem(lparam);

            //Release the device context handle obtained by a previous call
            e.Graphics.ReleaseHdc(hdc);

            //Return last + 1 character printer
            return res.ToInt32();
        }

        public PrintDocument CreatePrintDocument()
        {
            PrintDocument printDocument = new PrintDocument();
            printDocument.BeginPrint += new PrintEventHandler(printDocument_BeginPrint);
            printDocument.PrintPage += new PrintPageEventHandler(printDocument_PrintPage);
            return printDocument;
        }

        private int checkPrint = 0;
        private void printDocument_BeginPrint(object sender, PrintEventArgs e)
        {
            checkPrint = 0;
        }
        private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
        {
            // Print the content of RichTextBox. Store the last character printed.
            checkPrint = this.Print(checkPrint, this.TextLength, e);

            // Check for more pages
            if(checkPrint < this.TextLength)
                e.HasMorePages = true;
            else
                e.HasMorePages = false;
        }

    }
}
 
Odgovor na temu

[es] :: .NET :: Stampanje teksta iz RichTextbox-a

[ Pregleda: 2276 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.