示例#1
0
        /// <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();
            }
        }
示例#2
0
        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();
            }
        }
示例#3
0
    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();
            }
        }