C# 无边界winform阴影

C# 无边界winform阴影,c#,winforms,C#,Winforms,我有一个无边框的windows窗体,我使用下面的代码在它后面创建了一个阴影。 但是,当我点击父窗体时,阴影消失了 有谁能帮助我,即使在点击其他表单/父表单时,如何保持阴影? 例如,shaddow可以在不同的窗口chrome上看到,但不能在其父窗体上看到 我试过谷歌,但什么也找不到 更新 我注意到,如果我最小化窗口并再次将其最大化,阴影确实会回来 我的代码 提前感谢请尝试以下步骤,并返回任何错误: 将以下代码添加到名为DropShadow.cs的新代码文件中 using System; using

我有一个无边框的windows窗体,我使用下面的代码在它后面创建了一个阴影。 但是,当我点击父窗体时,阴影消失了

有谁能帮助我,即使在点击其他表单/父表单时,如何保持阴影? 例如,shaddow可以在不同的窗口chrome上看到,但不能在其父窗体上看到

我试过谷歌,但什么也找不到

更新 我注意到,如果我最小化窗口并再次将其最大化,阴影确实会回来

我的代码


提前感谢

请尝试以下步骤,并返回任何错误:

将以下代码添加到名为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
    }
}

请尝试以下步骤,并返回任何错误:

将以下代码添加到名为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
    }
}

在特定情况下,当可见性发生变化时,会对类进行安全性检查,从而重新应用类样式。您可以重写它,自己重新设置类样式。重写OnActivated,从CreateParams获取当前样式,调用base,然后调用:CreateParams cp=this.CreateParams;碱基活性肽;SetClassLongPtrthis.Handle,GCL_样式,IntPtrcp.ClassStyle | CS|u DROPSHADOW;此.Invalidatefalse;。这将在最小化窗体后还原窗体时,将CS_DROPSHADOW样式重新应用于该类。如果这是你指的。从描述上看不太清楚。还有其他方法,但看看这是否适用。谢谢,如果你能再多解释一点,我会很感激,我的C技能最多只是中级,我觉得这将进入一个完全不同的世界,我真的不知道当可见性发生变化时,在特定情况下,会对类进行安全检查,这将重新应用类样式。您可以重写它,自己重新设置类样式。重写OnActivated,从CreateParams获取当前样式,调用base,然后调用:CreateParams cp=this.CreateParams;碱基活性肽;SetClassLongPtrthis.Handle,GCL_样式,IntPtrcp.ClassStyle | CS|u DROPSHADOW;此.Invalidatefalse;。这将在最小化窗体后还原窗体时,将CS_DROPSHADOW样式重新应用于该类。如果这是你指的。从描述上看不太清楚。还有其他的方法,但看看这是否适用。谢谢,如果你能再解释一点,我会很感激,我的C语言技能最多只是中级水平,我觉得这将进入一个完全不同的世界,我真的不知道你是天才,我整天都在寻找这个。我不完全理解DropShadow类中发生了什么,但它正在工作。这是你的密码吗?或者你能指出一个有解释的地方吗?有一件小事,底部有一个很小的白色条纹,我的身体喘息着,所以它是可见的,有什么办法可以让它痛苦吗?@利润者:在代码中寻找“底部高度”。只需设置bottomHeight=0,而不是bottomHeight=1,它应该可以工作。我假设可以,但当我尝试完全移除阴影时,我只是尝试将条带移动到顶部,它看起来更适合我的特定应用,所以这对我来说很有效。再次非常感谢@男:很好,问题已经解决了。但是,如果将来遇到此问题,可以添加面板,而不是直接绘制窗体。你可以在面板上添加控件。你是个天才,我已经找了一整天了。我不完全理解DropShadow类中发生了什么,但它正在工作。这是你的密码吗?或者你能指出一个有解释的地方吗?有一件小事,底部有一个很小的白色条纹,我的身体喘息着,所以它是可见的,有什么办法可以让它痛苦吗?@利润者:在代码中寻找“底部高度”。只需设置bottomHeight=0,而不是bottomHeight=1,它应该可以工作。我假设可以,但当我尝试完全移除阴影时,我只是尝试将条带移动到顶部,它看起来更适合我的特定应用,所以这对我来说很有效。再次非常感谢@男:很好,问题已经解决了。但是,如果将来遇到此问题,可以添加面板,而不是直接绘制窗体。可以将控件添加到面板中。
(new Core.DropShadow()).ApplyShadows(this);