ThinkGeo.com    |     Documentation    |     Premium Support

Desktop edition printing map...where do I start?

Good morning,


I've never tried printing a map from MapSuite before.  I noticed a forum message indicating there is a sample in the "Getting Started" folder, but then I realized this was for a different edition.  As far as I can see the installed desktop edition 4.5 samples have no printing example.  I also checked the wiki desktop examples and didn't see anything there either.  We're not looking for much, probably a picture of the map, a header with a title , and a footer with a copyright notice.  That's about it.  Any pointers as to where I go to start working on this? 


Thanks,


Allen



Allen,


Thanks for your post and question. 


I think we do not contains a sample in our HowDoI sample list for now.
 
Probably you can take a try against the class PrinterGeoCanvas contained in the MapSuiteCore. Following posts contain some information you are interested:
gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/21/aft/7598/afv/topic/Default.aspx
gis.thinkgeo.com/Support/Dis...fault.aspx
 
Also, another solution is trying to save the map image on the map control into a disk image file, and then we can write our own printing logic to customize Header and other fields.
 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Allen: 
  
 I assume you are working in C#.  Here is how I printed my map, and works really well: 
  
 Create a public object for the printer: 
         public PrintDocument printDocument; 
  
 Put a button on your form to invoke the print: 
         private void btnPrint_Click(object sender, EventArgs e) 
         { 
             printDocument.Print(); 
             OPUSParentForm.Enabled = true; 
             this.Close(); 
         } 
  
 Put code in the PrintDocument object’s PrintPage function: 
         private void printDocument_PrintPage(object sender, PrintPageEventArgs e) 
         { 
             Font font = new Font(“Courier New”, 9); 
             float lineHeight = font.GetHeight(e.Graphics); 
  
             float x = e.MarginBounds.Left; float y = e.MarginBounds.Top; 
             int pagewidth = (int)(e.MarginBounds.Right / font.SizeInPoints); 
             int pageheight = (int)(e.MarginBounds.Bottom - e.MarginBounds.Top); 
             int Width = winformsMap1.Width; 
             int Height = winformsMap1.Height; 
             Bitmap bitmap2 = new Bitmap(Width,Height); 
             winformsMap1.DrawToBitmap(bitmap2, new Rectangle(0, 0, Width, Height)); 
  
             e.Graphics.DrawString(“your heading”);  
             y += lineHeight; 
             e.Graphics.DrawImage(bitmap2, x, y, 600, 500); 
             Pen boundPen = new Pen(Color.DarkGray, 1); 
             e.Graphics.DrawRectangle(boundPen, x, y, 600, 500); 
             y += 500 + lineHeight; 
             e.Graphics.DrawString(“your copyright”);  
         } 
  
 Hopefully this helps. 
  
 Elisa

Elisa, 
  
 Thanks for the code.  Yes, I’m working in C#.  I have a lot of other priorities higher than this, but we need to implement some simple printing before we ship our product.  I’ll get to look at this one of these days! 
  
 Allen

Elisa, thanks for the sharing!

Elisa, 
  
 This turned out to be easier than I thought after reviewing what you did.  I built a little user component that contains all the logic you showed.  The component uses a PrintPreviewControl because we want to see it first, but all the drawing logic is the same.  I also added the ability to change printer.  I looked at the PrintPreviewDialog but (1) it doesn’t have a built-in change printer button, (2) it doesn’t have a “printer setup” button, and (3) it has a bunch of multi-page preview buttons we don’t need.  So I just drop this component into a form, have the calling code pass the MapSuite bitmap and display the form, and it takes care of all the hard work.  I added a little logic to retrieve the widths of the header and footer so I could center them, and had to use a different DrawImage that let me rescale the map image because it was wider than the body of the page and was running off the paper.  Now the boss is thinking about adding the ability to print landscape since our map is wider, but I think I should be able to handle that. 
  
 Thanks, 
 Allen

Allen, 
  
 Thanks for your post and sharing, I appreciate it very much. 
  
 Thanks. 
  
 Yale