/// <summary> /// レイヤーにビットマップを描画 /// </summary> /// <param name="graph">描画したサーフェース</param> /// <param name="hBitmap">描画するビットマップ</param> private void GHFormDrawingOnLayer(ref Graphics graph, ref IntPtr hBitmap, ref Point point, ref Size size) { using (Graphics g_sc = Graphics.FromHwnd(IntPtr.Zero)) { IntPtr hdc_sc = g_sc.GetHdc(); IntPtr hdc_bmp = graph.GetHdc(); IntPtr oldhbmp = WinAPI.SelectObject(hdc_bmp, hBitmap); WinAPI.BLENDFUNCTION blend = new WinAPI.BLENDFUNCTION { BlendOp = WinAPI.AC_SRC_OVER, BlendFlags = 0, SourceConstantAlpha = animateInfo._Alpha, AlphaFormat = WinAPI.AC_SRC_ALPHA }; Point surfacePos = new Point(0, 0); WinAPI.UpdateLayeredWindow(Handle, hdc_sc, ref point, ref size, hdc_bmp, ref surfacePos, 0, ref blend, WinAPI.ULW_ALPHA); WinAPI.DeleteObject(WinAPI.SelectObject(hdc_bmp, oldhbmp)); g_sc.ReleaseHdc(); graph.ReleaseHdc(); } }
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 SetBitmap(Bitmap bitmap) { if (!IsHandleCreated || DesignMode) { return; } IntPtr oldBits = IntPtr.Zero; IntPtr screenDC = WinAPI.GetDC(IntPtr.Zero); IntPtr hBitmap = IntPtr.Zero; IntPtr memDC = WinAPI.CreateCompatibleDC(screenDC); try { Point topLocation = new Point(this.Left, this.Top); Size bitmapSize = new Size(bitmap.Width, bitmap.Height); WinAPI.BLENDFUNCTION blendFunc = new WinAPI.BLENDFUNCTION(); Point sourceLocation = Point.Empty; hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)); oldBits = WinAPI.SelectObject(memDC, hBitmap); blendFunc.BlendOp = WinAPI.AC_SRC_OVER; blendFunc.SourceConstantAlpha = 255; blendFunc.AlphaFormat = WinAPI.AC_SRC_ALPHA; blendFunc.BlendFlags = 0; WinAPI.UpdateLayeredWindow(Handle, screenDC, ref topLocation, ref bitmapSize, memDC, ref sourceLocation, 0, ref blendFunc, WinAPI.ULW_ALPHA); } finally { if (hBitmap != IntPtr.Zero) { WinAPI.SelectObject(memDC, oldBits); WinAPI.DeleteObject(hBitmap); } WinAPI.ReleaseDC(IntPtr.Zero, screenDC); WinAPI.DeleteDC(memDC); } }
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(); } }