1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
class TransparentPanel : Control
{
public const int SRCCOPY = 13369376;
[DllImport("gdi32.dll", EntryPoint = "DeleteDC")]
public static extern IntPtr DeleteDC(IntPtr hDc);
[DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
public static extern IntPtr DeleteObject(IntPtr hDc);
[DllImport("gdi32.dll", EntryPoint = "BitBlt")]
public static extern bool BitBlt(IntPtr hdcDest, int xDest,
int yDest, int wDest, int hDest, IntPtr hdcSource,
int xSrc, int ySrc, int RasterOp);
[DllImport("gdi32.dll", EntryPoint = "CreateCompatibleBitmap")]
public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc,
int nWidth, int nHeight);
[DllImport("gdi32.dll", EntryPoint = "CreateCompatibleDC")]
public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll", EntryPoint = "SelectObject")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
[DllImport("user32.dll", EntryPoint = "ReleaseDC")]
public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc);
[DllImport("user32.dll", EntryPoint = "GetDC")]
public static extern IntPtr GetDC(IntPtr ptr);
private BufferedGraphics bufferedGraphics;
public TransparentPanel()
{
SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
BufferedGraphicsManager.Current.MaximumBuffer = new Size(this.Width + 1, this.Height + 1);
bufferedGraphics = BufferedGraphicsManager.Current.Allocate(this.CreateGraphics(), ClientRectangle);
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
// base.OnPaintBackground(pevent);
}
protected override void OnPaint(PaintEventArgs e)
{
Bitmap b = GetWindowBackgroundAsBitmap( this.Parent.Handle, this.Left, this.Top, this.Width, this.Height);
bufferedGraphics.Graphics.DrawImage(b, 0, 0);
bufferedGraphics.Render(e.Graphics);
//base.OnPaint(e);
}
public static Bitmap GetWindowBackgroundAsBitmap(IntPtr wndHWND, int x, int y, int width, int height)
{
IntPtr wndHDC = GetDC(wndHWND);
IntPtr capHDC = CreateCompatibleDC(wndHDC);
IntPtr capBMP = CreateCompatibleBitmap(wndHDC, width, height);
if (capBMP == IntPtr.Zero)
{
ReleaseDC(wndHWND, wndHDC);
DeleteDC(capHDC);
return null;
}
IntPtr prvHDC = (IntPtr)SelectObject(capHDC, capBMP);
BitBlt(capHDC, 0, 0, width, height, wndHDC, x, y, SRCCOPY);
SelectObject(capHDC, prvHDC);
Bitmap bmp = System.Drawing.Image.FromHbitmap(capBMP);
ReleaseDC(wndHWND, wndHDC);
DeleteDC(capHDC);
DeleteObject(capBMP);
return bmp;
}
} |
Partager