internal void RefleshLayeredForm() { Bitmap formBitMap = new Bitmap(base.Width, base.Height); Graphics g = Graphics.FromImage(formBitMap); DrawShadow(g); WinAPI.POINT ptSrc = new WinAPI.POINT(0, 0); WinAPI.POINT ptWinPos = new WinAPI.POINT(base.Left, base.Top); WinAPI.SIZE szWinSize = new WinAPI.SIZE(Width, Height); byte biAlpha = 0xFF; WinAPI.BLENDFUNCTION stBlend = new WinAPI.BLENDFUNCTION( (byte)WinAPI.BlendOp.AC_SRC_OVER, 0, biAlpha, (byte)WinAPI.BlendOp.AC_SRC_ALPHA); IntPtr gdiBitMap = IntPtr.Zero; IntPtr memoryDC = IntPtr.Zero; IntPtr preBits = IntPtr.Zero; IntPtr screenDC = IntPtr.Zero; try { screenDC = WinAPI.GetDC(IntPtr.Zero); memoryDC = WinAPI.CreateCompatibleDC(screenDC); gdiBitMap = formBitMap.GetHbitmap(Color.FromArgb(0)); preBits = WinAPI.SelectObject(memoryDC, gdiBitMap); WinAPI.UpdateLayeredWindow(base.Handle , screenDC , ref ptWinPos , ref szWinSize , memoryDC , ref ptSrc , 0 , ref stBlend , (uint)WinAPI.ULWPara.ULW_ALPHA); } finally { if (gdiBitMap != IntPtr.Zero) { WinAPI.SelectObject(memoryDC, preBits); WinAPI.DeleteObject(gdiBitMap); } WinAPI.DeleteDC(memoryDC); WinAPI.ReleaseDC(IntPtr.Zero, screenDC); g.Dispose(); formBitMap.Dispose(); } }
public void SetBits() { //绘制绘图层背景 Bitmap bitmap = new Bitmap(Main.Width + 10, Main.Height + 10); Rectangle _BacklightLTRB = new Rectangle(20, 20, 20, 20);//窗体光泽重绘边界 Graphics g = Graphics.FromImage(bitmap); g.SmoothingMode = SmoothingMode.HighQuality; //高质量 g.PixelOffsetMode = PixelOffsetMode.HighQuality; //高像素偏移质量 ImageDrawRect.DrawRect(g, shadowimg, ClientRectangle, Rectangle.FromLTRB(_BacklightLTRB.X, _BacklightLTRB.Y, _BacklightLTRB.Width, _BacklightLTRB.Height), 1, 1); // RenderHelper.DrawImageWithNineRect(g, shadowimg, ClientRectangle, new Rectangle { Size = shadowimg.Size }); if (!Bitmap.IsCanonicalPixelFormat(bitmap.PixelFormat) || !Bitmap.IsAlphaPixelFormat(bitmap.PixelFormat)) { throw new ApplicationException("图片必须是32位带Alhpa通道的图片。"); } WinAPI.POINT ptSrc = new WinAPI.POINT(0, 0); WinAPI.POINT ptWinPos = new WinAPI.POINT(base.Left, base.Top); WinAPI.SIZE szWinSize = new WinAPI.SIZE(Width, Height); byte biAlpha = 0xFF; WinAPI.BLENDFUNCTION stBlend = new WinAPI.BLENDFUNCTION( (byte)WinAPI.BlendOp.AC_SRC_OVER, 0, biAlpha, (byte)WinAPI.BlendOp.AC_SRC_ALPHA); IntPtr gdiBitMap = IntPtr.Zero; IntPtr memoryDC = IntPtr.Zero; IntPtr preBits = IntPtr.Zero; IntPtr screenDC = IntPtr.Zero; try { screenDC = WinAPI.GetDC(IntPtr.Zero); memoryDC = WinAPI.CreateCompatibleDC(screenDC); gdiBitMap = bitmap.GetHbitmap(Color.FromArgb(0)); preBits = WinAPI.SelectObject(memoryDC, gdiBitMap); WinAPI.UpdateLayeredWindow(base.Handle , screenDC , ref ptWinPos , ref szWinSize , memoryDC , ref ptSrc , 0 , ref stBlend , (uint)WinAPI.ULWPara.ULW_ALPHA); } finally { if (gdiBitMap != IntPtr.Zero) { WinAPI.SelectObject(memoryDC, preBits); WinAPI.DeleteObject(gdiBitMap); } WinAPI.DeleteDC(memoryDC); WinAPI.ReleaseDC(IntPtr.Zero, screenDC); g.Dispose(); bitmap.Dispose(); } }