Можно ли использовать WM_NCPAINT и все же получить тень за окном на Aero? - PullRequest
3 голосов
/ 19 марта 2012

В настоящее время я пытаюсь создать в Windows Forms окно верхнего уровня с пользовательским фреймом (используя функцию SkinManager.EnableFormSkins DevExpress ), и все же имеет тень вокруг окна , при работе в Windows 7 Aero.

В настоящее время окно выглядит так:

enter image description here

, и я хочу, чтобы оно выглядело так:

enter image description here

(т. Е. Мягкая тень вокруг окна).

Я провел много исследований и проб и ошибок, в том числе с использованием CS_DROPSHADOW, запрашивая поддержку DevExpress , чтение по SO , другим блогам и документация MSDN .

Тем не менее, ничто не приносит тенимое окно.

Хотя я думаю, что мое требование просто невозможно выполнить, я все же хочу рискнуть и спросить здесь о SO.

(я даже думал подделать это, имеяродное окно Aero за моим фактическим окном, но не удалось реализовать ...)

Мой вопрос:

ЭтоМожно ли иметь окно с пользовательской областью, не относящейся к клиенту (NC), и по-прежнему получать тень вокруг этого окна, когда Aero активен?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2012

Подводя итог и закрывая свой собственный вопрос, после многих усилий я действительно думаю, что это просто невозможно.

То, чего я достиг, - это моделирование тени с использованием техники, используемой в * 1003.Статья Locus Effects .

В основном используйте прозрачное окно, динамически используйте альфа-смешение PNG в качестве смоделированной тени и рисуйте его вокруг сторон (и углов) окна;переместить прозрачное окно, когда реальное окно перемещается и т. д.

Это работает хорошо, но все равно выглядит для пользователя непрофессионально, потому что мелкие вещи, такие как тень, исчезают, когда другое окно активируется, не работает должным образом.

Итак, мой вывод: невозможно при разумных усилиях.

0 голосов
/ 19 марта 2012

Можете ли вы попробовать пользовательские тени выигрыша, например:

/// <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;
        }
    }       
}
...