Esempio n. 1
0
 public static extern bool UpdateLayeredWindow(IntPtr hwnd
     , IntPtr hdcDst
     , ref POINT pptDst
     , ref SIZE psize
     , IntPtr hdcSrc
     , ref POINT pptSrc
     , uint crKey
     , [In] ref BLENDFUNCTION pblend
     , uint dwFlags
     );
        protected void RefreshFakeWnd()
        {
            if (m_bIsRefreshing)
                return;

            if (!User32Dll.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 = User32Dll.GetDC(m_FakeWndHandle);
            if (hDC == IntPtr.Zero)
            {
                m_bIsRefreshing = false;
                Debug.Assert(false, "GetDC failed.");
                return;
            }

            IntPtr hdcMemory = GDI32Dll.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 = GDI32Dll.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 = GDI32Dll.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 (User32Dll.GetGUIThreadInfo(Kernal32Dll.GetCurrentThreadId(), ref stGuiThreadInfo))
                {
                    if (User32Dll.IsWindow(stGuiThreadInfo.hwndCaret))
                    {
                        int height = stGuiThreadInfo.rcCaret.Bottom - stGuiThreadInfo.rcCaret.Top;
                        POINT ptCaret = new POINT(stGuiThreadInfo.rcCaret.Left, stGuiThreadInfo.rcCaret.Top);

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

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

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

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

            GDI32Dll.DeleteDC(hdcMemory);
            GDI32Dll.DeleteDC(hDC);

            m_bIsRefreshing = false;
        }