• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 185
  • Last Modified:

Printing a custom control

I created a user control that contains a couple of labels. I integrated the control into a project and now I need to print everything on this control (labels and an image). I've been experimenting with the graphics object but can't figure out how to print the entire control with all of its information. The most I can get to print is the bitmap background image of the control which is contained in a picture box. How do I print a custom control in .NET? thanks
0
guidway
Asked:
guidway
  • 2
1 Solution
 
prakash_prkCommented:

get a snapshot of your control using a screen capture code
then print the image

------------------------------------------------------------------------------------------------------------------------------------
/// <summary>
      /// Provides functions to capture the entire screen, or a particular window, and save it to a file.
      /// </summary>
      public class ScreenCapture
      {
            /// <summary>
            /// Creates an Image object containing a screen shot of the entire desktop
            /// </summary>
            /// <returns></returns>
            public Image CaptureScreen()
            {
                  return CaptureWindow( User32.GetDesktopWindow() );
            }

            /// <summary>
            /// Creates an Image object containing a screen shot of a specific window
            /// </summary>
            /// <param name="handle">The handle to the window. (In windows forms, this is obtained by the Handle property)</param>
            /// <returns></returns>
            public Image CaptureWindow(IntPtr handle)
            {
                  // get te hDC of the target window
                  IntPtr hdcSrc = User32.GetWindowDC(handle);
                  // get the size
                  User32.RECT windowRect = new User32.RECT();
                  User32.GetWindowRect(handle,ref windowRect);
                  int width = windowRect.right - windowRect.left;
                  int height = windowRect.bottom - windowRect.top;
                  // create a device context we can copy to
                  IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
                  // create a bitmap we can copy it to,
                  // using GetDeviceCaps to get the width/height
                  IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc,width,height);
                  // select the bitmap object
                  IntPtr hOld = GDI32.SelectObject(hdcDest,hBitmap);
                  // bitblt over
                  GDI32.BitBlt(hdcDest,0,0,width,height,hdcSrc,0,0,GDI32.SRCCOPY);
                  // restore selection
                  GDI32.SelectObject(hdcDest,hOld);
                  // clean up
                  GDI32.DeleteDC(hdcDest);
                  User32.ReleaseDC(handle,hdcSrc);

                  // get a .NET image object for it
                  Image img = Image.FromHbitmap(hBitmap);
                  // free up the Bitmap object
                  GDI32.DeleteObject(hBitmap);

                  return img;
            }

            /// <summary>
            /// Captures a screen shot of a specific window, and saves it to a file
            /// </summary>
            /// <param name="handle"></param>
            /// <param name="filename"></param>
            /// <param name="format"></param>
            public void CaptureWindowToFile(IntPtr handle, string filename, ImageFormat format)
            {
                  Image img = CaptureWindow(handle);
                  img.Save(filename,format);
            }

            /// <summary>
            /// Captures a screen shot of the entire desktop, and saves it to a file
            /// </summary>
            /// <param name="filename"></param>
            /// <param name="format"></param>
            public void CaptureScreenToFile(string filename, ImageFormat format)
            {
                  Image img = CaptureScreen();
                  img.Save(filename,format);
            }
       
            /// <summary>
            /// Helper class containing Gdi32 API functions
            /// </summary>
            private class GDI32
            {
           
                  public const int SRCCOPY = 0x00CC0020; // BitBlt dwRop parameter

                  [DllImport("gdi32.dll")]
                  public static extern bool BitBlt(IntPtr hObject,int nXDest,int nYDest,
                        int nWidth,int nHeight,IntPtr hObjectSource,
                        int nXSrc,int nYSrc,int dwRop);
                  [DllImport("gdi32.dll")]
                  public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC,int nWidth,
                        int nHeight);
                  [DllImport("gdi32.dll")]
                  public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
                  [DllImport("gdi32.dll")]
                  public static extern bool DeleteDC(IntPtr hDC);
                  [DllImport("gdi32.dll")]
                  public static extern bool DeleteObject(IntPtr hObject);
                  [DllImport("gdi32.dll")]
                  public static extern IntPtr SelectObject(IntPtr hDC,IntPtr hObject);
            }
 
            /// <summary>
            /// Helper class containing User32 API functions
            /// </summary>
            private class User32
            {
                  [StructLayout(LayoutKind.Sequential)]
                        public struct RECT
                  {
                        public int left;
                        public int top;
                        public int right;
                        public int bottom;
                  }

                  [DllImport("user32.dll")]
                  public static extern IntPtr GetDesktopWindow();
                  [DllImport("user32.dll")]
                  public static extern IntPtr GetWindowDC(IntPtr hWnd);
                  [DllImport("user32.dll")]
                  public static extern IntPtr ReleaseDC(IntPtr hWnd,IntPtr hDC);
                  [DllImport("user32.dll")]
                  public static extern IntPtr GetWindowRect(IntPtr hWnd,ref RECT rect);
            }
      }
------------------------------------------------------------------------------------------------------------------------------------

did u have a code for printing?
0
 
prakash_prkCommented:
for printing use the following code
---------------------------------------

Image myIm;

ScreenCapture sd = new ScreenCapture();
myIm = sd.CaptureWindow(Handle);

PrintDocument pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);

pd.Print();

private void pd_PrintPage(object sender, PrintPageEventArgs e)
{
      e.Graphics.DrawImage(myIm,0,0,myIm.Width,myIm.Height);
      e.HasMorePages = false;
}
------------------------------------------------------------------------------------------

regards
prakash
0
 
guidwayAuthor Commented:
I made a few slight modifications and was able to get your code working exactly as expected. thanks for your help!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: MCSA MCSE Windows Server 2012

This course teaches how to install and configure Windows Server 2012 R2.  It is the first step on your path to becoming a Microsoft Certified Solutions Expert (MCSE).

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now