예제 #1
0
        public Size MeasureText(string text, Font font)
        {
            IntPtr fontHandle    = font.ToHfont();
            IntPtr oldFontHandle = NativeMethods.SelectObject(this.graphicsHandle, fontHandle);

            Size size = this.MeassureTextInternal(text);

            NativeMethods.SelectObject(this.graphicsHandle, oldFontHandle);
            NativeMethods.DeleteObject(fontHandle);

            return(size);
        }
예제 #2
0
        public void SetBits()
        {
            if (BackgroundImage != null)
            {
                //绘制绘图层背景
                var bitmap = new Bitmap(BackgroundImage, Width, Height);
                if (!Image.IsCanonicalPixelFormat(bitmap.PixelFormat) || !Image.IsAlphaPixelFormat(bitmap.PixelFormat))
                {
                    throw new ApplicationException("图片必须是32位带Alhpa通道的图片。");
                }
                var oldBits  = IntPtr.Zero;
                var screenDC = NativeMethods.GetDC(IntPtr.Zero);
                var hBitmap  = IntPtr.Zero;
                var memDc    = NativeMethods.CreateCompatibleDC(screenDC);

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

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

                    blendFunc.BlendOp             = AC.AC_SRC_OVER;
                    blendFunc.SourceConstantAlpha = byte.Parse(Main.SkinOpacity.ToString());
                    blendFunc.AlphaFormat         = AC.AC_SRC_ALPHA;
                    blendFunc.BlendFlags          = 0;

                    NativeMethods.UpdateLayeredWindow(Handle, screenDC, ref topLoc, ref bitMapSize, memDc, ref srcLoc, 0,
                                                      ref blendFunc, ULW.ULW_ALPHA);
                }
                finally
                {
                    if (hBitmap != IntPtr.Zero)
                    {
                        NativeMethods.SelectObject(memDc, oldBits);
                        NativeMethods.DeleteObject(hBitmap);
                    }
                    NativeMethods.ReleaseDC(IntPtr.Zero, screenDC);
                    NativeMethods.DeleteDC(memDc);
                }
            }
        }
예제 #3
0
        public static void SetBits(Form form, Bitmap bitmap, byte opcity)
        {
            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.
            var screenDc  = NativeMethods.GetDC(IntPtr.Zero);
            var memDc     = NativeMethods.CreateCompatibleDC(screenDc);
            var hBitmap   = IntPtr.Zero;
            var oldBitmap = IntPtr.Zero;

            try
            {
                hBitmap   = bitmap.GetHbitmap(Color.FromArgb(0)); // grab a GDI handle from this GDI+ bitmap
                oldBitmap = NativeMethods.SelectObject(memDc, hBitmap);
                var size        = new Size(bitmap.Width, bitmap.Height);
                var pointSource = new Point(0, 0);
                var topPos      = new Point(form.Left, form.Top);
                var blend       = new Win32.Struct.BLENDFUNCTION();
                blend.BlendOp             = AC.AC_SRC_OVER;
                blend.BlendFlags          = 0;
                blend.SourceConstantAlpha = opcity;
                blend.AlphaFormat         = AC.AC_SRC_ALPHA;
                NativeMethods.UpdateLayeredWindow(form.Handle, screenDc, ref topPos, ref size, memDc, ref pointSource, 0,
                                                  ref blend, UpdateLayerWindowParameter.ULW_ALPHA);
            }
            finally
            {
                NativeMethods.ReleaseDC(IntPtr.Zero, screenDc);
                if (hBitmap != IntPtr.Zero)
                {
                    NativeMethods.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 NativeMethods.GDI and it's working fine without any resource leak.
                    NativeMethods.DeleteObject(hBitmap);
                }
                NativeMethods.DeleteDC(memDc);
            }
            bitmap.Dispose();
        }
예제 #4
0
파일: BaseForm.cs 프로젝트: weinre/ChurSkin
        public void SetBits()
        {
            var image = new Bitmap(Main.Width + (Main.ShadowWidth * 2), Main.Height + (Main.ShadowWidth * 2));
            var g     = Graphics.FromImage(image);

            g.SmoothingMode   = SmoothingMode.HighQuality;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;
            DrawShadow(g);
            if (Image.IsCanonicalPixelFormat(image.PixelFormat) && Image.IsAlphaPixelFormat(image.PixelFormat))
            {
                var zero    = IntPtr.Zero;
                var dC      = NativeMethods.GetDC(IntPtr.Zero);
                var hgdiobj = IntPtr.Zero;
                var hdc     = NativeMethods.CreateCompatibleDC(dC);
                try
                {
                    var pptDst = new Win32.Struct.POINT(Left, Top);
                    var psize  = new Win32.Struct.SIZE(Width, Height);
                    var pblend = new Win32.Struct.BLENDFUNCTION();
                    var pprSrc = new Win32.Struct.POINT(0, 0);
                    hgdiobj                    = image.GetHbitmap(Color.FromArgb(0));
                    zero                       = NativeMethods.SelectObject(hdc, hgdiobj);
                    pblend.BlendOp             = 0;
                    pblend.SourceConstantAlpha = byte.Parse("255");
                    pblend.AlphaFormat         = 1;
                    pblend.BlendFlags          = 0;
                    NativeMethods.UpdateLayeredWindow(Handle, dC, ref pptDst, ref psize, hdc, ref pprSrc, 0, ref pblend,
                                                      2);
                    return;
                }
                finally
                {
                    if (hgdiobj != IntPtr.Zero)
                    {
                        NativeMethods.SelectObject(hdc, zero);
                        NativeMethods.DeleteObject(hgdiobj);
                    }
                    NativeMethods.ReleaseDC(IntPtr.Zero, dC);
                    NativeMethods.DeleteDC(hdc);
                }
            }
            throw new ApplicationException("图片必须是32位带Alhpa通道的图片。");
        }
예제 #5
0
        public static void SetBits(Form form, Bitmap bitmap)
        {
            //  if (!haveHandle) return;

            if (!Image.IsCanonicalPixelFormat(bitmap.PixelFormat) || !Image.IsAlphaPixelFormat(bitmap.PixelFormat))
            {
                throw new ApplicationException("图片必须是32位带Alhpa通道的图片。");
            }

            var oldBits  = IntPtr.Zero;
            var screenDC = NativeMethods.GetDC(IntPtr.Zero);
            var hBitmap  = IntPtr.Zero;
            var memDc    = NativeMethods.CreateCompatibleDC(screenDC);

            try
            {
                var topLoc     = new Point(form.Left, form.Top);
                var bitMapSize = new Size(bitmap.Width, bitmap.Height);
                var blendFunc  = new Win32.Struct.BLENDFUNCTION();
                var srcLoc     = new Point(0, 0);

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

                blendFunc.BlendOp             = AC.AC_SRC_OVER;
                blendFunc.SourceConstantAlpha = 255;
                blendFunc.AlphaFormat         = AC.AC_SRC_ALPHA;
                blendFunc.BlendFlags          = 0;

                NativeMethods.UpdateLayeredWindow(form.Handle, screenDC, ref topLoc, ref bitMapSize, memDc, ref srcLoc,
                                                  0, ref blendFunc, UpdateLayerWindowParameter.ULW_ALPHA);
            }
            finally
            {
                if (hBitmap != IntPtr.Zero)
                {
                    NativeMethods.SelectObject(memDc, oldBits);
                    NativeMethods.DeleteObject(hBitmap);
                }
                NativeMethods.ReleaseDC(IntPtr.Zero, screenDC);
                NativeMethods.DeleteDC(memDc);
            }
        }
예제 #6
0
 public virtual void UpdateWindow(Bitmap bitmap, double opacity)
 {
     if (bitmap == null)
     {
         return;
     }
     if (Image.IsCanonicalPixelFormat(bitmap.PixelFormat) && Image.IsAlphaPixelFormat(bitmap.PixelFormat))
     {
         IntPtr zero = IntPtr.Zero;
         IntPtr dC   = NativeMethods.GetDC(IntPtr.Zero);
         IntPtr hObj = IntPtr.Zero;
         IntPtr hDC  = NativeMethods.CreateCompatibleDC(dC);
         try
         {
             Point pptDst = new Point(base.Left, base.Top);
             Size  psize  = new Size(bitmap.Width, bitmap.Height);
             Struct.BLENDFUNCTION pblend = new Struct.BLENDFUNCTION();
             Point pptSrc = new Point(0, 0);
             hObj                       = bitmap.GetHbitmap(Color.FromArgb(0));
             zero                       = NativeMethods.SelectObject(hDC, hObj);
             pblend.BlendOp             = 0;
             pblend.SourceConstantAlpha = (byte)((int)(255.0 * opacity));
             pblend.AlphaFormat         = 1;
             pblend.BlendFlags          = 0;
             NativeMethods.UpdateWindow(base.Handle, dC, ref pptDst, ref psize, hDC, ref pptSrc, 0, ref pblend, 2);
             return;
         }
         finally
         {
             if (hObj != IntPtr.Zero)
             {
                 NativeMethods.SelectObject(hDC, zero);
                 NativeMethods.DeleteObject(hObj);
             }
             NativeMethods.ReleaseDC(IntPtr.Zero, dC);
             NativeMethods.DeleteDC(hDC);
         }
     }
     throw new ApplicationException("图片必须是32位带Alhpa通道的图片。");
 }
예제 #7
0
        protected void RefreshFakeWnd()
        {
            if (m_bIsRefreshing)
            {
                return;
            }

            if (!NativeMethods.IsWindow(m_FakeWndHandle))
            {
                return;
            }

            m_bIsRefreshing = true;
            POINT         ptSrc    = new POINT(0, 0);
            POINT         ptWinPos = new POINT(this.Left, this.Top);
            SIZE          szWin    = new SIZE(m_BgImg.Width, m_BgImg.Height);
            byte          biAlpha  = 0xFF;
            BLENDFUNCTION stBlend  = new BLENDFUNCTION(BlendOp.AC_SRC_OVER, 0, biAlpha, BlendOp.AC_SRC_ALPHA);

            IntPtr hDC = NativeMethods.GetDC(m_FakeWndHandle);

            if (hDC == IntPtr.Zero)
            {
                m_bIsRefreshing = false;
                Debug.Assert(false, "GetDC failed.");
                return;
            }

            IntPtr hdcMemory = NativeMethods.CreateCompatibleDC(hDC);

            int nBytesPerLine = ((m_BgImg.Width * 32 + 31) & (~31)) >> 3;
            BITMAPINFOHEADER stBmpInfoHeader = new BITMAPINFOHEADER();

            stBmpInfoHeader.Init();
            stBmpInfoHeader.biWidth       = m_BgImg.Width;
            stBmpInfoHeader.biHeight      = m_BgImg.Height;
            stBmpInfoHeader.biPlanes      = 1;
            stBmpInfoHeader.biBitCount    = 32;
            stBmpInfoHeader.biCompression = CompressionType.BI_RGB;
            stBmpInfoHeader.biClrUsed     = 0;
            stBmpInfoHeader.biSizeImage   = (uint)(nBytesPerLine * m_BgImg.Height);

            IntPtr pvBits  = IntPtr.Zero;
            IntPtr hbmpMem = NativeMethods.CreateDIBSection(hDC
                                                            , ref stBmpInfoHeader
                                                            , DIBColorTableIdentifier.DIB_RGB_COLORS
                                                            , out pvBits
                                                            , IntPtr.Zero
                                                            , 0
                                                            );

            Debug.Assert(hbmpMem != IntPtr.Zero, "CreateDIBSection failed.");

            if (hbmpMem != null)
            {
                IntPtr hbmpOld = NativeMethods.SelectObject(hdcMemory, hbmpMem);

                Graphics graphic = Graphics.FromHdcInternal(hdcMemory);

                graphic.DrawImage(m_BgImg, 0, 0, m_BgImg.Width, m_BgImg.Height);

                foreach (Control ctrl in this.Controls)
                {
                    if (!ctrl.Visible)
                    {
                        continue;
                    }

                    using (Bitmap bmp = new Bitmap(ctrl.Width, ctrl.Height))
                    {
                        Rectangle rect = new Rectangle(0, 0, ctrl.Width, ctrl.Height);
                        ctrl.DrawToBitmap(bmp, rect);

                        graphic.DrawImage(bmp, ctrl.Left, ctrl.Top, ctrl.Width, ctrl.Height);
                    }
                }

                GUITHREADINFO stGuiThreadInfo = new GUITHREADINFO();
                stGuiThreadInfo.Init();
                if (NativeMethods.GetGUIThreadInfo((uint)NativeMethods.GetCurrentThreadId(), ref stGuiThreadInfo))
                {
                    if (NativeMethods.IsWindow(stGuiThreadInfo.hwndCaret))
                    {
                        int   height  = stGuiThreadInfo.rcCaret.Bottom - stGuiThreadInfo.rcCaret.Top;
                        POINT ptCaret = new POINT(stGuiThreadInfo.rcCaret.Left, stGuiThreadInfo.rcCaret.Top);

                        NativeMethods.ClientToScreen(stGuiThreadInfo.hwndCaret, ref ptCaret);
                        NativeMethods.ScreenToClient(this.Handle, ref ptCaret);

                        graphic.DrawLine(new Pen(new SolidBrush(Color.Black))
                                         , ptCaret.X
                                         , ptCaret.Y
                                         , ptCaret.X
                                         , ptCaret.Y + height
                                         );
                    }
                }


                NativeMethods.UpdateLayeredWindow(m_FakeWndHandle
                                                  , hDC
                                                  , ref ptWinPos
                                                  , ref szWin
                                                  , hdcMemory
                                                  , ref ptSrc
                                                  , 0
                                                  , ref stBlend
                                                  , UpdateLayerWindowParameter.ULW_ALPHA
                                                  );

                graphic.Dispose();
                NativeMethods.SelectObject(hbmpMem, hbmpOld);
                NativeMethods.DeleteObject(hbmpMem);
            }

            NativeMethods.DeleteDC(hdcMemory);
            NativeMethods.DeleteDC(hDC);

            m_bIsRefreshing = false;
        }