0% found this document useful (0 votes)
38 views

Printig Help

This document describes a process for printing a Windows form in C# without a built-in printing method. It involves capturing the form as an image using BitBlt, saving the image as a JPEG, and printing the image file. The code examples show selecting the PrintPage event, capturing the form as an image on a button click, and a StartPrint method to open the print dialog and print the image stream. When printing is complete, the temporary image file is deleted.

Uploaded by

api-26891935
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
38 views

Printig Help

This document describes a process for printing a Windows form in C# without a built-in printing method. It involves capturing the form as an image using BitBlt, saving the image as a JPEG, and printing the image file. The code examples show selecting the PrintPage event, capturing the form as an image on a button click, and a StartPrint method to open the print dialog and print the image stream. When printing is complete, the temporary image file is deleted.

Uploaded by

api-26891935
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 3

Introduction

Vb.net has a PrintForm method but C# does not have inbuilt method for printing a windows
form.The following procedure enables us to print a windows form at runtime in c#.net.The
base concept involves the capture of  the screen image of the windows form in jpeg format
during runtime and printing the same on a event like Print button click.

Open a new windows form project and add a new windows form. Include simple
controls(label,textbox,button) on the form.From the toolbox,include
PrintDialog,PrintDocument components in the form.

In the code behind

Include the following namespaces

using System.Drawing.Imaging;
using System.Drawing.Printing;

and import the following .dll for the necessary GDI functions

[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]

The following code is placed in the declaration section of the form. The BitBlt function
performs a bit-block transfer of the color data corresponding to a rectangle of pixels from
the specified source device context into a destination device context.

private System.IO.Stream streamToPrint;


string streamType;
private static extern bool BitBlt
(
IntPtr hdcDest, // handle to destination DC
int nXDest, // x-coord of destination upper-left corner
int nYDest, // y-coord of destination upper-left corner
int nWidth, // width of destination rectangle
int nHeight, // height of destination rectangle
IntPtr hdcSrc, // handle to source DC
int nXSrc, // x-coordinate of source upper-left corner
int nYSrc, // y-coordinate of source upper-left corner
System.Int32 dwRop // raster operation code
);

Select the PrintPage event of the PrintDocument component and


include the following code in the event
private void printDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs
e)
{
System.Drawing.Image image = System.Drawing.Image.FromStream
    this.streamToPrint;
int x = e.MarginBounds.X;
int y = e.MarginBounds.Y;
int width = image.Width;
int height = image.Height;
if ((width / e.MarginBounds.Width) > (height / e.MarginBounds.Height))
{
width = e.MarginBounds.Width;
height = image.Height * e.MarginBounds.Width / image.Width;
}
else
{
height = e.MarginBounds.Height;
width = image.Width * e.MarginBounds.Height / image.Height;
}
System.Drawing.Rectangle destRect = new System.Drawing.Rectangle(x, y, width,
height);
e.Graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height,
System.Drawing.GraphicsUnit.Pixel);
}

Include the following code in the Print Click event handler


private void btnPrint_Click(object sender, EventArgs e)
{
Graphics g1 = this.CreateGraphics();
Image MyImage = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height,
g1);
Graphics g2 = Graphics.FromImage(MyImage);
IntPtr dc1 = g1.GetHdc();
IntPtr dc2 = g2.GetHdc();
BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0,
13369376);
g1.ReleaseHdc(dc1);
g2.ReleaseHdc(dc2);
MyImage.Save(@"c:\PrintPage.jpg", ImageFormat.Jpeg);
FileStream fileStream = new FileStream(@"c:\PrintPage.jpg", FileMode.Open,
FileAccess.Read);
StartPrint(fileStream, "Image");
fileStream.Close();
  if (System.IO.File.Exists(@"c:\PrintPage.jpg"))
{
System.IO.File.Delete(@"c:\PrintPage.jpg");
}
}

And the StatrtPrint method to customize the PrintDialog and print the stored
image
public void StartPrint(Stream streamToPrint, string streamType)
{
this.printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
this.streamToPrint = streamToPrint;
this.streamType = streamType;
System.Windows.Forms.PrintDialog PrintDialog1 = new PrintDialog();
PrintDialog1.AllowSomePages = true;
PrintDialog1.ShowHelp = true;
PrintDialog1.Document = printDoc;
  DialogResult result = PrintDialog1.ShowDialog();
if (result == DialogResult.OK)
{
printDoc.Print();
//docToPrint.Print();
}
}

The captured image is saved in jpeg format in the defined location.When the
print functionality is used throughout an application and the image is not
required to be stored, the existing image file is deleted and the new one
created is streamed to print.If the image is required to be stored, the
filename can be specified at runtime and stored in the given path.

On running the application,the form is displayed as in the image below

On click of  the Print button, the Print dialog is displayed.

You might also like