diff --git a/ChangeLog b/ChangeLog index 9a823b38c..f25dbc955 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-04-26 Miguel de Icaza + + * gtkdotnet/Graphics.cs: Contribution from Sebastian Faltoni + that implements support for using + System.Drawing on Windows. + 2005-04-26 Mike Kestner * gtk/NodeStore.cs : implement IEnumerable. diff --git a/gtkdotnet/Graphics.cs b/gtkdotnet/Graphics.cs index 5109f9008..4a8b02705 100644 --- a/gtkdotnet/Graphics.cs +++ b/gtkdotnet/Graphics.cs @@ -33,6 +33,15 @@ namespace Gtk.DotNet { private Graphics () {} + [DllImport("libgdk-win32-2.0-0.dll")] + internal static extern IntPtr gdk_win32_drawable_get_handle(IntPtr raw); + + [DllImport("libgdk-win32-2.0-0.dll")] + internal static extern IntPtr gdk_win32_hdc_get(IntPtr drawable, IntPtr gc, int usage); + + [DllImport("libgdk-win32-2.0-0.dll")] + internal static extern void gdk_win32_hdc_release(IntPtr drawable,IntPtr gc,int usage); + [DllImport("libgdk-win32-2.0-0.dll")] internal static extern IntPtr gdk_x11_drawable_get_xdisplay (IntPtr raw); @@ -40,29 +49,55 @@ namespace Gtk.DotNet { internal static extern IntPtr gdk_x11_drawable_get_xid (IntPtr raw); public static System.Drawing.Graphics FromDrawable (Gdk.Drawable drawable) + { + return FromDrawable (drawable, true); + } + + public static System.Drawing.Graphics FromDrawable(Gdk.Drawable drawable, bool double_buffered) { IntPtr x_drawable; int x_off = 0, y_off = 0; + + PlatformID osversion = Environment.OSVersion.Platform; + + if (osversion == PlatformID.Win32Windows || osversion == PlatformID.Win32NT || + osversion == PlatformID.Win32S || osversion == PlatformID.WinCE){ + if (drawable is Gdk.Window && double_buffered) + ((Gdk.Window)drawable).GetInternalPaintInfo(out drawable, out x_off, out y_off); + + Gdk.GC gcc = new Gdk.GC(drawable); - - if (drawable is Gdk.Window) - ((Gdk.Window) drawable).GetInternalPaintInfo(out drawable, out x_off, out y_off); - - x_drawable = drawable.Handle; - - IntPtr display = gdk_x11_drawable_get_xdisplay (x_drawable); - - Type graphics = typeof (System.Drawing.Graphics); - MethodInfo mi = graphics.GetMethod ("FromXDrawable", BindingFlags.Static | BindingFlags.NonPublic); - if (mi == null) - throw new NotImplementedException ("In this implementation I can not get a graphics from a drawable"); - object [] args = new object [2] { (IntPtr) gdk_x11_drawable_get_xid (drawable.Handle), (IntPtr) display }; - object r = mi.Invoke (null, args); - System.Drawing.Graphics g = (System.Drawing.Graphics) r; - - g.TranslateTransform (-x_off, -y_off); - - return g; + IntPtr windc = gdk_win32_hdc_get(drawable.Handle, gcc.Handle, 0); + + System.Drawing.Graphics g = System.Drawing.Graphics.FromHdc(windc); + + if (double_buffered) { + gdk_win32_hdc_release(drawable.Handle, gcc.Handle, 0); + } + + g.TranslateTransform(-x_off, -y_off); + + return g; + } else { + if (drawable is Gdk.Window && double_buffered) + ((Gdk.Window) drawable).GetInternalPaintInfo(out drawable, out x_off, out y_off); + + x_drawable = drawable.Handle; + + IntPtr display = gdk_x11_drawable_get_xdisplay (x_drawable); + + Type graphics = typeof (System.Drawing.Graphics); + MethodInfo mi = graphics.GetMethod ("FromXDrawable", BindingFlags.Static | BindingFlags.NonPublic); + if (mi == null) + throw new NotImplementedException ("In this implementation I can not get a graphics from a drawable"); + object [] args = new object [2] { (IntPtr) gdk_x11_drawable_get_xid (drawable.Handle), (IntPtr) display }; + object r = mi.Invoke (null, args); + System.Drawing.Graphics g = (System.Drawing.Graphics) r; + + g.TranslateTransform (-x_off, -y_off); + + return g; + } } }