Search code examples
c#winformsprintingtelerikpreview

How to print the content of a panel with RadPrintPreview?


i want print the content of panel with RadPrintPreview of telerik , but when i declare RadPrintDocument i cant associat this later with panel ! this is my code :

private void doc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{

        Bitmap bmp = new Bitmap(radPanel2.Width, radPanel2.Height, radPanel2.CreateGraphics());
        radPanel2.DrawToBitmap(bmp, new Rectangle(0, 0, radPanel2.Width, radPanel2.Height));

        RectangleF bounds = e.PageSettings.PrintableArea;
        e.Graphics.DrawImage(bmp, bounds.Left, bounds.Top, radPanel2.Width, radPanel2.Height);

}
private void btn_Imression_Click(object sender, EventArgs e)
{

        System.Drawing.Printing.PrintDocument doc = new System.Drawing.Printing.PrintDocument();
        doc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(doc_PrintPage);
        RadPrintPreviewDialog PrintSettings = new RadPrintPreviewDialog();

        PrintSettings.Document = doc;
        PageSettings pgsetting = new PageSettings();

        if (PrintSettings.ShowDialog() == DialogResult.OK)
            doc.Print();
}

and thank's for help :)


Solution

  • In order to print Telerik UI for WinForms control, you should use the embedded in the framework functionality, namely RadPrintDocument, which allows you to print any object implementing the IPrintable interface. Here is how this can be done for RadPanel:

        RadPanel panel = new RadPanel();
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            InitializeComponent();
    
            panel.Dock = DockStyle.Fill;
            panel.BackColor = Color.Red;
            panel.Parent = this;
    
            RadButton b = new RadButton();
            b.Text = "button1";
            panel.Controls.Add(b);
    
            RadButton b2 = new RadButton();
            b2.Text = "button1";
            b2.Location = new Point(400, 400);
            panel.Controls.Add(b2);
    
    
        }
    
        private class PanelPrinter : IPrintable
        {
            private RadPanel panel;
    
            public PanelPrinter(RadPanel panel)
            {
                this.panel = panel;
            }
    
            public int BeginPrint(RadPrintDocument sender, PrintEventArgs args)
            {
                return 1;
            }
    
            public bool EndPrint(RadPrintDocument sender, PrintEventArgs args)
            {
                return false;
            }
    
            public Form GetSettingsDialog(RadPrintDocument document)
            {
                return null;
            }
    
            public bool PrintPage(int pageNumber, RadPrintDocument sender, PrintPageEventArgs args)
            {
                float scale = Math.Min((float)args.MarginBounds.Width / panel.Size.Width, (float)args.MarginBounds.Height / panel.Size.Height);
    
                Bitmap panelBmp = new Bitmap(this.panel.Width, this.panel.Height);
                this.panel.DrawToBitmap(panelBmp, this.panel.Bounds);
    
                Matrix saveMatrix = args.Graphics.Transform;
                args.Graphics.ScaleTransform(scale, scale);
                args.Graphics.DrawImage(panelBmp, args.MarginBounds.Location);
                args.Graphics.Transform = saveMatrix;
    
                return false;
            }
        }
    
        private void radButton1_Click(object sender, EventArgs e)
        {
            RadPrintDocument document = new RadPrintDocument();
            document.AssociatedObject = new PanelPrinter(this.panel);
            RadPrintPreviewDialog dialog = new RadPrintPreviewDialog(document);
    
            dialog.ShowDialog();
        }