private static IntPtr WmNcPaint(IntPtr hwnd, IntPtr wparam, ref bool handled)
        {
            var hrgnClip = wparam == new IntPtr(1) ? IntPtr.Zero : wparam;
            var dcEx     = NativeMethods.GetDCEx(hwnd, hrgnClip, 155);

            if (dcEx != IntPtr.Zero)
            {
                try
                {
                    var nonClientFillColor = Colors.Black;
                    var solidBrush         =
                        NativeMethods.CreateSolidBrush(nonClientFillColor.B << 16 | nonClientFillColor.G << 8 |
                                                       nonClientFillColor.R);
                    try
                    {
                        var relativeToWindowRect = GetClientRectRelativeToWindowRect(hwnd);
                        relativeToWindowRect.Top    = relativeToWindowRect.Bottom;
                        relativeToWindowRect.Bottom = relativeToWindowRect.Top + 1;
                        NativeMethods.FillRect(dcEx, ref relativeToWindowRect, solidBrush);
                    }
                    finally
                    {
                        NativeMethods.DeleteObject(solidBrush);
                    }
                }
                finally
                {
                    NativeMethods.ReleaseDC(hwnd, dcEx);
                }
            }
            handled = true;
            return(IntPtr.Zero);
        }
        protected IntPtr ComputeCornerRadiusRectRegion(Int32Rect rect, CornerRadius cornerRadius)
        {
            if (cornerRadius.TopLeft == cornerRadius.TopRight && cornerRadius.TopLeft == cornerRadius.BottomLeft &&
                cornerRadius.BottomLeft == cornerRadius.BottomRight)
            {
                return(ComputeRoundRectRegion(rect.X, rect.Y, rect.Width, rect.Height, (int)cornerRadius.TopLeft));
            }
            var num1  = IntPtr.Zero;
            var num2  = IntPtr.Zero;
            var num3  = IntPtr.Zero;
            var num4  = IntPtr.Zero;
            var num5  = IntPtr.Zero;
            var num6  = IntPtr.Zero;
            var num7  = IntPtr.Zero;
            var num8  = IntPtr.Zero;
            var num9  = IntPtr.Zero;
            var num10 = IntPtr.Zero;

            try
            {
                num1 = ComputeRoundRectRegion(rect.X, rect.Y, rect.Width, rect.Height, (int)cornerRadius.TopLeft);
                num2 = ComputeRoundRectRegion(rect.X, rect.Y, rect.Width, rect.Height, (int)cornerRadius.TopRight);
                num3 = ComputeRoundRectRegion(rect.X, rect.Y, rect.Width, rect.Height,
                                              (int)cornerRadius.BottomLeft);
                num4 = ComputeRoundRectRegion(rect.X, rect.Y, rect.Width, rect.Height,
                                              (int)cornerRadius.BottomRight);
                var point = new Core.Platform.Point
                {
                    X = rect.X + rect.Width / 2,
                    Y = rect.Y + rect.Height / 2
                };
                num5  = NativeMethods.CreateRectRgn(rect.X, rect.Y, point.X + 1, point.Y + 1);
                num6  = NativeMethods.CreateRectRgn(point.X - 1, rect.Y, rect.X + rect.Width, point.Y + 1);
                num7  = NativeMethods.CreateRectRgn(rect.X, point.Y - 1, point.X + 1, rect.Y + rect.Height);
                num8  = NativeMethods.CreateRectRgn(point.X - 1, point.Y - 1, rect.X + rect.Width, rect.Y + rect.Height);
                num9  = NativeMethods.CreateRectRgn(0, 0, 1, 1);
                num10 = NativeMethods.CreateRectRgn(0, 0, 1, 1);
                NativeMethods.CombineRgn(num10, num1, num5, NativeMethods.CombineMode.RgnAnd);
                NativeMethods.CombineRgn(num9, num2, num6, NativeMethods.CombineMode.RgnAnd);
                NativeMethods.CombineRgn(num10, num10, num9, NativeMethods.CombineMode.RgnOr);
                NativeMethods.CombineRgn(num9, num3, num7, NativeMethods.CombineMode.RgnAnd);
                NativeMethods.CombineRgn(num10, num10, num9, NativeMethods.CombineMode.RgnOr);
                NativeMethods.CombineRgn(num9, num4, num8, NativeMethods.CombineMode.RgnAnd);
                NativeMethods.CombineRgn(num10, num10, num9, NativeMethods.CombineMode.RgnOr);
            }
            finally
            {
                if (num1 != IntPtr.Zero)
                {
                    NativeMethods.DeleteObject(num1);
                }
                if (num2 != IntPtr.Zero)
                {
                    NativeMethods.DeleteObject(num2);
                }
                if (num3 != IntPtr.Zero)
                {
                    NativeMethods.DeleteObject(num3);
                }
                if (num4 != IntPtr.Zero)
                {
                    NativeMethods.DeleteObject(num4);
                }
                if (num5 != IntPtr.Zero)
                {
                    NativeMethods.DeleteObject(num5);
                }
                if (num6 != IntPtr.Zero)
                {
                    NativeMethods.DeleteObject(num6);
                }
                if (num7 != IntPtr.Zero)
                {
                    NativeMethods.DeleteObject(num7);
                }
                if (num8 != IntPtr.Zero)
                {
                    NativeMethods.DeleteObject(num8);
                }
                if (num9 != IntPtr.Zero)
                {
                    NativeMethods.DeleteObject(num9);
                }
            }
            return(num10);
        }