Border-less winform form shadow

前端 未结 1 520
名媛妹妹
名媛妹妹 2020-12-04 03:14

I have a border-less windows form that i created a shadow behind it using the code below.
However when I click on the parent form the shadow disappears.

<
相关标签:
1条回答
  • 2020-12-04 04:03

    Pls try the below steps and revert back for any errors:

    Add the below code to a new code file named DropShadow.cs;

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace Core
    {
        public class DropShadow
        {
            #region Shadowing
    
            #region Fields
    
            private bool _isAeroEnabled = false;
            private bool _isDraggingEnabled = false;
            private const int WM_NCHITTEST = 0x84;
            private const int WS_MINIMIZEBOX = 0x20000;
            private const int HTCLIENT = 0x1;
            private const int HTCAPTION = 0x2;
            private const int CS_DBLCLKS = 0x8;
            private const int CS_DROPSHADOW = 0x00020000;
            private const int WM_NCPAINT = 0x0085;
            private const int WM_ACTIVATEAPP = 0x001C;
    
            #endregion
    
            #region Structures
    
            [EditorBrowsable(EditorBrowsableState.Never)]
            public struct MARGINS
            {
                public int leftWidth;
                public int rightWidth;
                public int topHeight;
                public int bottomHeight;
            }
    
            #endregion
    
            #region Methods
    
            #region Public
    
            [DllImport("dwmapi.dll")]
            [EditorBrowsable(EditorBrowsableState.Never)]
            public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
    
            [DllImport("dwmapi.dll")]
            [EditorBrowsable(EditorBrowsableState.Never)]
            public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
    
            [DllImport("dwmapi.dll")]
            [EditorBrowsable(EditorBrowsableState.Never)]
            public static extern int DwmIsCompositionEnabled(ref int pfEnabled);
    
            [EditorBrowsable(EditorBrowsableState.Never)]
            public static bool IsCompositionEnabled()
            {
                if (Environment.OSVersion.Version.Major < 6) return false;
    
                bool enabled;
                DwmIsCompositionEnabled(out enabled);
    
                return enabled;
            }
    
            #endregion
    
            #region Private
    
            [DllImport("dwmapi.dll")]
            private static extern int DwmIsCompositionEnabled(out bool enabled);
    
            [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
            private static extern IntPtr CreateRoundRectRgn
            (
                int nLeftRect,
                int nTopRect,
                int nRightRect,
                int nBottomRect,
                int nWidthEllipse,
                int nHeightEllipse
             );
    
            private bool CheckIfAeroIsEnabled()
            {
                if (Environment.OSVersion.Version.Major >= 6)
                {
                    int enabled = 0;
                    DwmIsCompositionEnabled(ref enabled);
    
                    return (enabled == 1) ? true : false;
                }
                return false;
            }
    
            #endregion
    
            #region Overrides
    
            public void ApplyShadows(Form form)
            {
                var v = 2;
    
                DwmSetWindowAttribute(form.Handle, 2, ref v, 4);
    
                MARGINS margins = new MARGINS()
                {
                    bottomHeight = 1,
                    leftWidth = 0,
                    rightWidth = 0,
                    topHeight = 0
                };
    
                DwmExtendFrameIntoClientArea(form.Handle, ref margins);
            }
    
            #endregion
    
            #endregion
    
            #endregion
        }
    }
    

    In your form, add this line below InitializeComponent();

    (new Core.DropShadow()).ApplyShadows(this);
    
    0 讨论(0)
提交回复
热议问题