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

[c#] sadrzaj richtext box-a sa se snimi kao slika

[es] :: .NET :: [c#] sadrzaj richtext box-a sa se snimi kao slika

[ Pregleda: 2415 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

johnnyc

Član broj: 175590
Poruke: 202
*.dynamic.sbb.rs.



Profil

icon [c#] sadrzaj richtext box-a sa se snimi kao slika17.10.2009. u 14:15 - pre 146 meseci
pozdrav,

da li postoji neki brz i efikasa nacin, pomocu kog mogu sadrzaj richTextBox-a da snimim kao sliku (bilo kog formata)?

vazno mi je da se sacuva formatiranje teksta, boja fonta, bold, italic, kao i velicina.

hvala unapred!
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
77.46.207.*

Jabber: DarkMan


Profil

icon Re: [c#] sadrzaj richtext box-a sa se snimi kao slika17.10.2009. u 15:00 - pre 146 meseci
U temi http://www.elitesecurity.org/t365472-0 sam dao kod za stampanje RichTextBox-a a u nastavku imas doradjen kod za dobijanje bitmape.

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();

            DisplayImage(rich.ToBitmap(new Size(1024, 768)));
        }

        /// <summary>
        /// Debug method, displays image in a dialog.
        /// </summary>
        public static void DisplayImage(Image image, PictureBoxSizeMode sizeMode)
        {
            Form form = null;
            PictureBox pictureBox = null;
            Label label = null;
            try {
                form = new Form();
                pictureBox = new PictureBox();
                string labelText = string.Empty;
                try {
                    if(image != null) {
                        pictureBox.Image = image;
                        pictureBox.SizeMode = sizeMode;
                        pictureBox.Dock = DockStyle.Fill;
                        form.Controls.Add(pictureBox);
                    } else {
                        labelText = "null";
                    }
                } catch(Exception ex) {
                    labelText = ex.ToString() + Environment.NewLine + Environment.NewLine + ex.Message;
                }
                if(!string.IsNullOrEmpty(labelText)) {
                    label = new Label();
                    label.AutoSize = false;
                    label.Text = labelText;
                    label.TextAlign = ContentAlignment.MiddleCenter;
                    label.Dock = DockStyle.Fill;
                    form.Controls.Add(label);
                }
                //form.Size = new Size(800, 600);
                form.StartPosition = FormStartPosition.CenterScreen;
                form.ShowDialog();
            } catch { }
            try { if(label != null) label.Dispose(); } catch { }
            try { if(pictureBox != null) pictureBox.Dispose(); } catch { }
            try { if(form != null) form.Dispose(); } catch { }
        }

        /// <summary>
        /// Debug method, displays image in a dialog.
        /// </summary>
        public static void DisplayImage(Image image)
        {
            DisplayImage(image, PictureBoxSizeMode.CenterImage);
        }
    }

    [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;
        }



        public Bitmap ToBitmap(Size size)
        {            
            Bitmap bitmap = new Bitmap(size.Width, size.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            Graphics g = Graphics.FromImage(bitmap);
            //g.Clear(Color.White);
            PrintPageEventArgs e = new PrintPageEventArgs(g,  new Rectangle(Point.Empty, bitmap.Size), new Rectangle(Point.Empty, bitmap.Size), new PageSettings());
            this.Print(0, this.TextLength, e);
            g.Dispose();
            return bitmap;
        }
    }
}
 
Odgovor na temu

johnnyc

Član broj: 175590
Poruke: 202
*.dynamic.sbb.rs.



Profil

icon Re: [c#] sadrzaj richtext box-a sa se snimi kao slika03.11.2009. u 04:55 - pre 145 meseci
hvala na odgovoru.

kako bih mogao da napravim da mi pozadina slike bude providna? pokusavao sam da setuem da mi je label.BackColor = Color.Transparent i slicno, ali pozadina mi uvek ostaje bela...
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
79.101.252.*

Jabber: DarkMan


Profil

icon Re: [c#] sadrzaj richtext box-a sa se snimi kao slika03.11.2009. u 17:09 - pre 145 meseci
Pozadina slike ili pozadina labele?
Za labelu bi trebalo da radi tako kako si napisao.
Za sliku probaj da prilikom kreiranja koristis format PixelFormat.Format32bppArgb a onda odradis g.Clear(Color.Transparent).
 
Odgovor na temu

johnnyc

Član broj: 175590
Poruke: 202
*.dynamic.sbb.rs.



Profil

icon Re: [c#] sadrzaj richtext box-a sa se snimi kao slika03.11.2009. u 18:41 - pre 145 meseci
I pozadina slike i pozadina labele treba da budu providne. Tekst u labeli treba da bude u nekoj boji.

Code...

Code:

        public Bitmap ToBitmap(Size size, int id)
        {
            Bitmap bitmap = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppArgb);
            bitmap.MakeTransparent(); // probao sam i sa i bez ove linije
            Graphics g = Graphics.FromImage(bitmap);
            g.Clear(Color.Transparent); 
            //PrintPageEventArgs e = new PrintPageEventArgs(g, new Rectangle(Point.Empty, bitmap.Size), new Rectangle(Point.Empty, bitmap.Size), new PageSettings());
            //this.Print(0, this.TextLength, e);
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            bitmap.Save("img/" + id.ToString() + ".png", ImageFormat.Png);
            g.Dispose();
            return bitmap;
        }



Ako ovako zakomentarisem liniju (linije), dobijem transparentni png, na kom naravno ne pise nista. Ako su te dve linije odkomentarisane, onda mi na mestu gde je label bela pozadina....

Labelu kreiram kao sto je gore napisano sa

Code:

public static void DisplayImage(Image image, PictureBoxSizeMode sizeMode)


Definisao boju labele ili ne, sve sto dobijem je beo pravougaoink...


Sta bi moglo da bude?

[Ovu poruku je menjao johnnyc dana 03.11.2009. u 20:00 GMT+1]
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
93.86.77.*

Jabber: DarkMan


Profil

icon Re: [c#] sadrzaj richtext box-a sa se snimi kao slika03.11.2009. u 20:28 - pre 145 meseci
Jel ti hoces da imas transparentnu labelu preko slike?
Ako je tako onda ces to tesko postici jer kontrole koje su transparentne u sustini nisu transparentne u pravom smislu vec prilikom iscrtavanja iscrtaju pozadinu svog parenta, u ovom slucaju forme.

Na sledecem linku imas slicno objasnjenje: http://www.bobpowell.net/transcontrols.htm
 
Odgovor na temu

johnnyc

Član broj: 175590
Poruke: 202
*.dynamic.sbb.rs.



Profil

icon Re: [c#] sadrzaj richtext box-a sa se snimi kao slika03.11.2009. u 21:24 - pre 145 meseci
pa pazi, u osnovi mi je trebalo da sadrzaj richtextbox-a prebacim u sliku, podrzavajuci fontove i boje.

to si mi resio sa code-om koji si prolozio.

ali onda je iskrsao sledeci problem, a to je da mi je potrebno da je pozadina tog teksta koji smo prekopirali iz richtextbox-a, bude transparentna.

tako da se sada sa tim patim....



 
Odgovor na temu

johnnyc

Član broj: 175590
Poruke: 202
*.dynamic.sbb.rs.



Profil

icon Re: [c#] sadrzaj richtext box-a sa se snimi kao slika03.11.2009. u 23:45 - pre 145 meseci
da li postoji mogucnost da ga namicam da bude bilo koje boje? cak ni ne mora da bude transparentan, samo da nije beo.
 
Odgovor na temu

johnnyc

Član broj: 175590
Poruke: 202
*.dynamic.sbb.rs.



Profil

icon Re: [c#] sadrzaj richtext box-a sa se snimi kao slika04.11.2009. u 16:43 - pre 145 meseci
posto ni sam ne volim one koji sve cekaju da odgovore dobiju na tacni, potrudio sam se da nadjem odgovor, pa da ga podelim sa vama...


Code:

rich.BackColor = Color.FromArgb(140, 14, 14);



na ovaj nacin, slika koja se kreira od teksta koji je upisan u richtextbox ce biti definisane boje (140, 14, 14), tako da je to od prilike ono sto ce mi posluziti za zavrsim posao.


u svakom slucaju, veliko hvala svima koji su mi pomogli da nekako resim ovo
:-)
 
Odgovor na temu

[es] :: .NET :: [c#] sadrzaj richtext box-a sa se snimi kao slika

[ Pregleda: 2415 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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