可以使用WM_NCPAINT并仍然可以获得Aero窗口后面的阴影吗?

时间:2012-03-19 17:47:53

标签: c# winforms aero dwm

目前,我正在尝试使用自定义框架(使用DevExpress“SkinManager.EnableFormSkins function)在Windows窗体中创建一个顶级窗口,并且在窗口周围仍然有阴影在Windows 7 Aero上运行。

目前窗口如下:

enter image description here

我希望它看起来像这样:

enter image description here

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

我做了大量研究和尝试错误,包括使用CS_DROPSHADOWasking the DevExpress supportreading on SOother blogsMSDN documentation

但是,没有任何东西给我的窗户带来阴影。

虽然我认为我的要求根本无法实现,但我仍然想抓住机会并在此问问。

(我甚至想过通过在我的实际窗口后面放置一个原生的Aero窗口来伪造这个但是未能实现......)

我的问题是:

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

2 个答案:

答案 0 :(得分:0)

你能尝试这样的自定义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;
        }
    }       
}

答案 1 :(得分:0)

总结并结束我自己的问题,经过多方努力,我认为这根本不可能。

我所取得的成就是使用Locus Effects article中使用的技术来模拟阴影。

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

这样做效果很好,但对用户来说仍然看起来有点不专业,因为当其他窗口被激活而不像预期的那样,影子会消失掉。

所以我的结论是:用合理的努力是不可能的。