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