Well there's obviously some way to draw the control ... otherwise it
wouldn't show up normally.  Heh.  :)

Perhaps just dig into the Mono code, find how the control renders
itself, and expose that through the DrawToBitmap method.  You
certainly wouldn't have to implement this for every known control ...
just the specific one you're using.  Implementing more, of course,
wouldn't cause anyone to complain.

Of course that is .Net 2.0 as Sebastien points out and you've stated
that isn't an option.

-Abe

On 2/28/07, Sebastien Pouliot <[EMAIL PROTECTED]> wrote:
> On Wed, 2007-02-28 at 15:34 -0500, Abe Gillespie wrote:
> > Have you tried the DrawToBitmap method?
>
> Nice one, but 2.0 and not yet implemented in Mono.
>
> > -Abe
> >
> > On 2/28/07, Eric Morgan <[EMAIL PROTECTED]> wrote:
> > > The problem isn't resizing - I don't have an original bitmap to resize.  
> > > The
> > > problem is that I have a control that I want a screenshot of.  So, I'm
> > > trying to create a Bitmap from whatever is appearing in the control.
> > >
> > > I pass the control in, then I call control.CreateGraphics();
> > > System.Drawing.Graphics g1 = c.CreateGraphics();
> > >
> > > Then, with the resulting graphics object, I try to create a new bitmap.
> > > Bitmap MyImage = new Bitmap(w, h, g1);
> > >
> > > The thing is, this bitmap is blank, unless I paste back in that BitBlt 
> > > code.
> > >  I can't figure out how to get a new bitmap from a graphics object, 
> > > without
> > > BitBlt().
> > >
> > > Sebastien - Using 2.0 isn't an option, unfortunately.
> > >
> > > Is there any alternative from P/Invoking in this case?
> > >
> > > Thanks for all the help!
> > >
> > > Eric
> > >
> > >
> > > On 2/28/07, Abe Gillespie < [EMAIL PROTECTED]> wrote:
> > > > It looks like you're just taking the image and resizing it to show in
> > > > the dialog.  You really should not have to go into native OS libraries
> > > > to do so.  Does this site help?
> > > >
> > > > http://www.peterprovost.org/archive/2003/05/29/516.aspx
> > > >
> > > > -Abe
> > > >
> > > > On 2/28/07, Eric Morgan <[EMAIL PROTECTED]> wrote:
> > > > > I'm not too sure how to get a Bitmap object from a graphics object.
> > > From
> > > > > all I've read, I just hear that you have to deal with device contexts.
> > > I'm
> > > > > not too familiar with it, but BitBlt seems to be the way to do that.
> > > What
> > > > > would I need to do to get that bitmap created with what appears in the
> > > > > control using 100% .NET so it can run in mono?  Here's a snippet of
> > > code.
> > > > >
> > > > >
> > > > >
> > > [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
> > > > >         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
> > > > >             );
> > > > >
> > > > >
> > > > >         public static Bitmap PerformCapture(Control c, int maxWidth, 
> > > > > int
> > > > > maxHeight)
> > > > >         {
> > > > >             try
> > > > >             {
> > > > >                 int w = c.ClientRectangle.Width;
> > > > >                 int h = c.ClientRectangle.Height;
> > > > >
> > > > >                 w = System.Math.Min(w, maxWidth);
> > > > >                 h = System.Math.Min(w, maxHeight);
> > > > >
> > > > >                 System.Drawing.Graphics g1 =
> > > > > c.CreateGraphics();//this.CreateGraphics();
> > > > >                 Bitmap MyImage = new Bitmap(w, h, g1);
> > > > >                 System.Drawing.Graphics g2 =
> > > > > System.Drawing.Graphics.FromImage (MyImage);
> > > > >                 IntPtr dc1 = g1.GetHdc();
> > > > >                 IntPtr dc2 = g2.GetHdc();
> > > > >                 BitBlt(dc2, 0, 0, w, h, dc1, 0, 0, 13369376);
> > > > >                 g1.ReleaseHdc(dc1);
> > > > >                 g2.ReleaseHdc(dc2);
> > > > >
> > > > > //Separate dialog to display the image.  If I comment out the BitBlt
> > > code,
> > > > > it just appears blank.
> > > > >
> > > Library.Windows.Dialogs.ScreenCaptureDlg
> > > > > dlg = new
> > > > > Library.Windows.Dialogs.ScreenCaptureDlg(MyImage);
> > > > >                 dlg.ShowDialog();
> > > > >
> > > > >                 return MyImage;
> > > > >             }
> > > > >             catch(Exception error)
> > > > >             {
> > > > > //our exception handling library.
> > > > >                 Library.Common.ErrMsg.Err( error );
> > > > >                 throw error;
> > > > >
> > > > >             }
> > > > >         }
> > > > >
> > > > >
> > > > >
> > > > > On 2/28/07, Abe Gillespie <[EMAIL PROTECTED]> wrote:
> > > > > > Are you P/Invoking for performance?  Why not just use the GDI .Net
> > > API?
> > > > > >
> > > > > > -Abe
> > > > > >
> > > > > > On 2/28/07, Eric Morgan <[EMAIL PROTECTED]> wrote:
> > > > > > > Hi all,
> > > > > > >
> > > > > > > Is there a good way to capture screens or something similar in 
> > > > > > > mono?
> > >  In
> > > > > our
> > > > > > > .NET application, we have custom controls, and we basically 
> > > > > > > create a
> > > > > > > graphics object from it, make a new bitmap, then do a bitblt to 
> > > > > > > get
> > > it
> > > > > into
> > > > > > > the bitmap.  This requires a P/Invoke into gdi32.dll , which
> > > obviously
> > > > > blows
> > > > > > > up in mono.  Is there a good way to do this using mono?  Some 
> > > > > > > other
> > > > > library
> > > > > > > maybe?
> > > > > > >
> > > > > > > I've tried installing wine and using the gdi32.dll.so that comes
> > > with
> > > > > it,
> > > > > > > but I don't know if I'm using it correctly or not.  It can find 
> > > > > > > the
> > > > > library,
> > > > > > > but it gives a SIGSEGV while trying to execute the bitblt 
> > > > > > > operation.
> > > > > Seemed
> > > > > > > like kind of a hack, and I didn't really expect it to work...  Do 
> > > > > > > I
> > > need
> > > > > > > other libraries along with the gdi32.dll.so ?
> > > > > > >
> > > > > > > Any advice is appreciated.  Thanks.
> > > > > > >
> > > > > > > Eric Morgan
> > > > > > > Renegade Geophysics
> > > > > > > 303-661-0400, x2
> > > > > > >
> > > > > > > _______________________________________________
> > > > > > > Mono-list maillist  -  [email protected]
> > > > > > > http://lists.ximian.com/mailman/listinfo/mono-list
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > > _______________________________________________
> > > > > Mono-list maillist  -  [email protected]
> > > > > http://lists.ximian.com/mailman/listinfo/mono-list
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> > > _______________________________________________
> > > Mono-list maillist  -  [email protected]
> > > http://lists.ximian.com/mailman/listinfo/mono-list
> > >
> > >
> > _______________________________________________
> > Mono-list maillist  -  [email protected]
> > http://lists.ximian.com/mailman/listinfo/mono-list
>
> _______________________________________________
> Mono-list maillist  -  [email protected]
> http://lists.ximian.com/mailman/listinfo/mono-list
>
_______________________________________________
Mono-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to