Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Drawing;
- using System.Drawing.Imaging;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
- using System.Collections.Generic;
- using System.Diagnostics;
- namespace mynamespace
- {
- class MyPerPixelAlphaForm : Form
- {
- IntPtr hBitmap = IntPtr.Zero;
- IntPtr oldBitmap = IntPtr.Zero;
- IntPtr screenDc = IntPtr.Zero;
- IntPtr memDc = IntPtr.Zero;
- Bitmap mbitmap;
- private List<Label> dynamiclabel = new List<Label>();
- // Let Windows drag this form for us
- public MyPerPixelAlphaForm()
- {
- // This form should not have a border or else Windows will clip it.
- FormBorderStyle = FormBorderStyle.None;
- }
- /// <para>Changes the current bitmap.</para>
- public void SetBitmap(Bitmap bitmap)
- {
- SetBitmap(bitmap, 255);
- }
- /// <para>Changes the current bitmap with a custom opacity level. Here is where all happens!</para>
- public void SetBitmap(Bitmap bitmap, byte opacity)
- {
- if (bitmap.PixelFormat != PixelFormat.Format32bppArgb)
- throw new ApplicationException("The bitmap must be 32ppp with alpha-channel.");
- // The ideia of this is very simple,
- // 1. Create a compatible DC with screen;
- // 2. Select the bitmap with 32bpp with alpha-channel in the compatible DC;
- // 3. Call the UpdateLayeredWindow.
- hBitmap = IntPtr.Zero;
- oldBitmap = IntPtr.Zero;
- screenDc = Win32.GetDC(IntPtr.Zero);
- memDc = Win32.CreateCompatibleDC(screenDc);
- mbitmap = bitmap;
- try
- {
- hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)); // grab a GDI handle from this GDI+ bitmap
- oldBitmap = Win32.SelectObject(memDc, hBitmap);
- Win32.Size size = new Win32.Size(bitmap.Width, bitmap.Height);
- Win32.Point pointSource = new Win32.Point(0, 0);
- Win32.Point topPos = new Win32.Point(Left, Top);
- Win32.BLENDFUNCTION blend = new Win32.BLENDFUNCTION();
- blend.BlendOp = Win32.AC_SRC_OVER;
- blend.BlendFlags = 0;
- blend.SourceConstantAlpha = opacity;
- blend.AlphaFormat = Win32.AC_SRC_ALPHA;
- Win32.UpdateLayeredWindow(Handle, screenDc, ref topPos, ref size, memDc, ref pointSource, 0, ref blend, Win32.ULW_ALPHA);
- }
- finally
- {
- Win32.ReleaseDC(IntPtr.Zero, screenDc);
- if (hBitmap != IntPtr.Zero)
- {
- Win32.SelectObject(memDc, oldBitmap);
- //Windows.DeleteObject(hBitmap); // The documentation says that we have to use the Windows.DeleteObject... but since there is no such method I use the normal DeleteObject from Win32 GDI and it's working fine without any resource leak.
- Win32.DeleteObject(hBitmap);
- }
- Win32.DeleteDC(memDc);
- }
- }
- // can also edit existing images if id exists
- public void add_Image(Bitmap img, int posx, int posy, int id)
- {
- }
- // can also edit existing text if id exists
- public void add_Text(String text, int posx, int posy, Color col, Font mfont, int id)
- {
- if (id < 0)
- {
- Label temp = new Label();
- temp.Text = text;
- temp.Location = new Point(posx, posy);
- temp.Font = mfont;
- temp.ForeColor = col;
- this.Controls.Add(temp);
- temp.BringToFront();
- dynamiclabel.Add(temp);
- }
- else
- {
- dynamiclabel[id].Text = text;
- dynamiclabel[id].Location = new Point(posx, posy);
- dynamiclabel[id].Font = mfont;
- dynamiclabel[id].ForeColor = col;
- }
- }
- protected override CreateParams CreateParams
- {
- get
- {
- CreateParams cp = base.CreateParams;
- cp.ExStyle |= 0x00080000; // This form has to have the WS_EX_LAYERED extended style
- return cp;
- }
- }
- }
- class Win32
- {
- public enum Bool
- {
- False = 0,
- True
- };
- [StructLayout(LayoutKind.Sequential)]
- public struct Point
- {
- public Int32 x;
- public Int32 y;
- public Point(Int32 x, Int32 y) { this.x = x; this.y = y; }
- }
- [StructLayout(LayoutKind.Sequential)]
- public struct Size
- {
- public Int32 cx;
- public Int32 cy;
- public Size(Int32 cx, Int32 cy) { this.cx = cx; this.cy = cy; }
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- struct ARGB
- {
- public byte Blue;
- public byte Green;
- public byte Red;
- public byte Alpha;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct BLENDFUNCTION
- {
- public byte BlendOp;
- public byte BlendFlags;
- public byte SourceConstantAlpha;
- public byte AlphaFormat;
- }
- public const Int32 ULW_COLORKEY = 0x00000001;
- public const Int32 ULW_ALPHA = 0x00000002;
- public const Int32 ULW_OPAQUE = 0x00000004;
- public const byte AC_SRC_OVER = 0x00;
- public const byte AC_SRC_ALPHA = 0x01;
- [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
- public static extern Bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);
- [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
- public static extern IntPtr GetDC(IntPtr hWnd);
- [DllImport("user32.dll", ExactSpelling = true)]
- public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
- [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
- public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
- [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
- public static extern Bool DeleteDC(IntPtr hdc);
- [DllImport("gdi32.dll", ExactSpelling = true)]
- public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
- [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
- public static extern Bool DeleteObject(IntPtr hObject);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement