Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以使用WM_NCPAINT并在Aero上获得窗口后的阴影?_C#_Winforms_Aero_Dwm - Fatal编程技术网

C# 是否可以使用WM_NCPAINT并在Aero上获得窗口后的阴影?

C# 是否可以使用WM_NCPAINT并在Aero上获得窗口后的阴影?,c#,winforms,aero,dwm,C#,Winforms,Aero,Dwm,目前,我正在尝试在Windows窗体中创建一个具有自定义框架的顶级窗口(使用DevExpress'),并且在Windows 7 Aero上运行时,窗口周围仍有阴影 该窗口当前如下所示: /// <summary> /// Base class for drop shadows forms. /// </summary> public partial class DropShadowForm : Form { private const int CS_DROPSHA

目前,我正在尝试在Windows窗体中创建一个具有自定义框架的顶级窗口(使用DevExpress'),并且在Windows 7 Aero上运行时,窗口周围仍有阴影

该窗口当前如下所示:

/// <summary>
/// Base class for drop shadows forms.
/// </summary>
public partial class DropShadowForm : Form
{
    private const int CS_DROPSHADOW = 0x00020000;

    /// <summary>
    /// Creates new instance of DropShadowForm.
    /// </summary>
    public DropShadowForm()
    {
        InitializeComponent();
    }

    /// <summary>
    /// Overrides from base class.
    /// </summary>
    protected override CreateParams CreateParams
    {
        [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
        get
        {
            CreateParams parameters = base.CreateParams;

            if (DropShadowSupported)
            {
                parameters.ClassStyle = (parameters.ClassStyle | CS_DROPSHADOW);
            }

            return parameters;
        }
    }

    /// <summary>
    /// Gets indicator if drop shadow is supported
    /// </summary>
    public static bool DropShadowSupported
    {
        get
        {
            OperatingSystem system = Environment.OSVersion;
            bool runningNT = system.Platform == PlatformID.Win32NT;

            return runningNT && system.Version.CompareTo(new Version(5, 1, 0, 0)) >= 0;
        }
    }       
}

我希望它看起来像这样:

/// <summary>
/// Base class for drop shadows forms.
/// </summary>
public partial class DropShadowForm : Form
{
    private const int CS_DROPSHADOW = 0x00020000;

    /// <summary>
    /// Creates new instance of DropShadowForm.
    /// </summary>
    public DropShadowForm()
    {
        InitializeComponent();
    }

    /// <summary>
    /// Overrides from base class.
    /// </summary>
    protected override CreateParams CreateParams
    {
        [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
        get
        {
            CreateParams parameters = base.CreateParams;

            if (DropShadowSupported)
            {
                parameters.ClassStyle = (parameters.ClassStyle | CS_DROPSHADOW);
            }

            return parameters;
        }
    }

    /// <summary>
    /// Gets indicator if drop shadow is supported
    /// </summary>
    public static bool DropShadowSupported
    {
        get
        {
            OperatingSystem system = Environment.OSVersion;
            bool runningNT = system.Platform == PlatformID.Win32NT;

            return runningNT && system.Version.CompareTo(new Version(5, 1, 0, 0)) >= 0;
        }
    }       
}

(即窗户周围有一个柔和的阴影)

我做了很多研究,尝试了很多错误,包括使用
CS\u DROPSHADOW
、和

然而,没有什么能给我的窗户带来阴影

虽然我认为我的要求根本不可能实现,但我还是想借此机会在这里提出要求

(我甚至想通过在我的实际窗口后面有一个本机Aero窗口来假装这一点,但未能实现…)

我的问题是:


当Aero处于活动状态时,是否可能有一个带有自定义绘制的非客户端(NC)区域的窗口,并且仍然会在该窗口周围产生阴影?

您是否可以尝试这样的自定义win窗体阴影:

/// <summary>
/// Base class for drop shadows forms.
/// </summary>
public partial class DropShadowForm : Form
{
    private const int CS_DROPSHADOW = 0x00020000;

    /// <summary>
    /// Creates new instance of DropShadowForm.
    /// </summary>
    public DropShadowForm()
    {
        InitializeComponent();
    }

    /// <summary>
    /// Overrides from base class.
    /// </summary>
    protected override CreateParams CreateParams
    {
        [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
        get
        {
            CreateParams parameters = base.CreateParams;

            if (DropShadowSupported)
            {
                parameters.ClassStyle = (parameters.ClassStyle | CS_DROPSHADOW);
            }

            return parameters;
        }
    }

    /// <summary>
    /// Gets indicator if drop shadow is supported
    /// </summary>
    public static bool DropShadowSupported
    {
        get
        {
            OperatingSystem system = Environment.OSVersion;
            bool runningNT = system.Platform == PlatformID.Win32NT;

            return runningNT && system.Version.CompareTo(new Version(5, 1, 0, 0)) >= 0;
        }
    }       
}
//
///放置阴影窗体的基类。
/// 
公共部分类DropShadowForm:Form
{
私有常量int CS_DROPSHADOW=0x00020000;
/// 
///创建DropShadowForm的新实例。
/// 
公共表格()
{
初始化组件();
}
/// 
///从基类重写。
/// 
受保护的重写CreateParams CreateParams
{
[SecurityPermission(SecurityAction.LinkDemand,UnmanagedCode=true)]
得到
{
CreateParams参数=base.CreateParams;
如果(不受支持)
{
parameters.ClassStyle=(parameters.ClassStyle | CS|u DROPSHADOW);
}
返回参数;
}
}
/// 
///获取是否支持放置阴影的指示器
/// 
支持公共静态布尔值
{
得到
{
OperatingSystem=Environment.OSVersion;
bool runningNT=system.Platform==PlatformID.Win32NT;
返回runningNT&&system.Version.CompareTo(新版本(5,1,0,0))>=0;
}
}       
}

总结并结束我自己的问题,经过很多努力,我确实认为这是不可能的

我所取得的成就是通过使用中使用的技术来模拟阴影

基本上使用透明窗口,动态使用alpha混合PNG作为模拟阴影,并围绕窗口的边(和角)绘制阴影;当真实窗口移动时,移动透明窗口,等等

这很好,但对用户来说仍然有点不专业,因为当其他窗口被激活时,阴影会消失之类的小事情并没有按照预期进行


因此,我的结论是:经过合理的努力是不可能的。

谢谢@Marcin-我忘了提到我已经试过了。不幸的是,该阴影与Aero阴影无关。我认为这是可能的,重写wndproc并将
if(m.Msg==WM_ACTIVATE)DwmExtendFrameIntoClientArea(this.Handle,ref MARGIN)边距应填充1(0不起作用),例如
边距={1,1,1}FrameBorderStyle也必须是FrameBorderStyle。若要使其正常工作,其大小必须相当大。因此,您必须这样做:
如果(m.Msg==WM_NCCALCSIZE&&m.WParam!=IntPtr.Zero){m.Result=IntPtr.Zero;return;}
删除帧边框。