C# Winform 窗口影像效果的实现

版权声明:本博客内容均是自创,如有雷同,纯属巧合 https://blog.csdn.net/zhanggqianglovec/article/details/88786261

 public void SetBits(Bitmap bitmap)
        {
            if (!Image.IsCanonicalPixelFormat(bitmap.PixelFormat) || !Image.IsAlphaPixelFormat(bitmap.PixelFormat))
                throw new ApplicationException("图片必须是32位带Alhpa通道的图片。");
            IntPtr oldBits = IntPtr.Zero;
            IntPtr screenDC = FormStyleAPI.GetDC(IntPtr.Zero);
            IntPtr hBitmap = IntPtr.Zero;
            IntPtr memDc = FormStyleAPI.CreateCompatibleDC(screenDC);

            try
            {
                FormStyleAPI.Point topLoc = new FormStyleAPI.Point(Left, Top);
                FormStyleAPI.Size bitMapSize = new FormStyleAPI.Size(Width, Height);
                FormStyleAPI.BLENDFUNCTION blendFunc = new FormStyleAPI.BLENDFUNCTION();
                FormStyleAPI.Point srcLoc = new FormStyleAPI.Point(0, 0);

                hBitmap = bitmap.GetHbitmap(Color.FromArgb(0));
                oldBits = FormStyleAPI.SelectObject(memDc, hBitmap);

                blendFunc.BlendOp = FormStyleAPI.AC_SRC_OVER;
                blendFunc.SourceConstantAlpha = Byte.Parse(((int)(/*Main.Opacity*/1 * 255)).ToString());
                blendFunc.AlphaFormat = FormStyleAPI.AC_SRC_ALPHA;
                blendFunc.BlendFlags = 0;

                FormStyleAPI.UpdateLayeredWindow(Handle, screenDC, ref topLoc, ref bitMapSize, memDc, ref srcLoc, 0, ref blendFunc, FormStyleAPI.ULW_ALPHA);
            }
            finally
            {
                if (hBitmap != IntPtr.Zero)
                {
                    FormStyleAPI.SelectObject(memDc, oldBits);
                    FormStyleAPI.DeleteObject(hBitmap);
                }
                FormStyleAPI.ReleaseDC(IntPtr.Zero, screenDC);
                FormStyleAPI.DeleteDC(memDc);
            }
        }

猜你喜欢

转载自blog.csdn.net/zhanggqianglovec/article/details/88786261