3

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

窗口当前如下所示:

在此处输入图像描述

我希望它看起来像这样:

在此处输入图像描述

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

我做了很多研究和试错,包括使用CS_DROPSHADOW询问 DevExpress 支持阅读 SO其他博客MSDN 文档

尽管如此,没有什么给我的窗户带来阴影。

尽管我认为我的要求根本无法实现,但我仍然想借此机会在这里问一下。

(我什至想通过在我的实际窗口后面有一个本机 Aero 窗口来伪造这个,但未能实现......)

我的问题是:

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

4

2 回答 2

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;
        }
    }       
}
于 2012-03-19T17:58:44.890 回答
0

总结和结束我自己的问题,经过大量努力,我认为这根本不可能。

我实现的是通过使用Locus Effects 文章中使用的技术来模拟阴影。

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

这很好用,但对用户来说仍然看起来有点不专业,因为当其他窗口被激活时,阴影消失之类的小东西没有按预期运行。

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

于 2012-04-04T06:34:42.113 回答