Как создать Windows 10 акриловый эффект прозрачности в Winform c # - PullRequest
0 голосов
/ 06 июня 2019

Я хочу создать форму с поддержкой дизайна акрилового материала. Как вы можете видеть, почти во всех приложениях Microsoft есть эффект прозрачности. Я хочу создать подобное. Это не невозможно сделать, потому что DevExpress уже сделал (Свободная форма)

Таким образом, у каждого есть код для создания эффекта прозрачности Windows 10 в Winform

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Мне не было особенно трудно получить сам акриловый эффект в Windows Forms (см. https://withinrafael.com/2015/07/08/adding-the-aero-glass-blur-to-your-windows-10-apps/),, но действительно сложная задача - заставить Win32 работать с ним хорошо:

Изменение размера формы также очень сильно отстает от самого курсора мыши. Мне было бы интересно взглянуть на то, что делает DevExpress, но похоже, что есть гораздо больше, чем просто включить акрил. Скорее всего, вам придется рисовать все, что идет поверх него, подобно тому, как Aero glass был, но хуже, потому что теперь вам придется рисовать и строку заголовка и границы.

Пример кода

Внимание! Это недокументированные API. См. Рэймонда Чена * Когда программы превращаются в недокументированные структуры… перед продолжением.

using System;
using System.Drawing;
using System.Windows.Forms;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnHandleCreated(EventArgs e)
    {
        // Use e.g. Color.FromArgb(128, Color.Lime) for a 50% opacity green tint.
        WindowUtils.EnableAcrylic(this, Color.Transparent);

        base.OnHandleCreated(e);
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        e.Graphics.Clear(Color.Transparent);
    }
}

WindowUtils.cs:

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public static class WindowUtils
{
    public static void EnableAcrylic(IWin32Window window, Color blurColor)
    {
        if (window is null) throw new ArgumentNullException(nameof(window));

        var accentPolicy = new AccentPolicy
        {
            AccentState = ACCENT.ENABLE_ACRYLICBLURBEHIND,
            GradientColor = ToAbgr(blurColor)
        };

        unsafe
        {
            SetWindowCompositionAttribute(
                new HandleRef(window, window.Handle),
                new WindowCompositionAttributeData
                {
                    Attribute = WCA.ACCENT_POLICY,
                    Data = &accentPolicy,
                    DataLength = Marshal.SizeOf<AccentPolicy>()
                });
        }
    }

    private static uint ToAbgr(Color color)
    {
        return ((uint)color.A << 24)
            | ((uint)color.B << 16)
            | ((uint)color.G << 8)
            | color.R;
    }

    // ReSharper disable InconsistentNaming, UnusedMember.Local, NotAccessedField.Local
#pragma warning disable 649

    // Discovered via:
    // https://withinrafael.com/2015/07/08/adding-the-aero-glass-blur-to-your-windows-10-apps/
    // https://github.com/riverar/sample-win32-acrylicblur/blob/917adc277c7258307799327d12262ebd47fd0308/MainWindow.xaml.cs

    [DllImport("user32.dll")]
    private static extern int SetWindowCompositionAttribute(HandleRef hWnd, in WindowCompositionAttributeData data);

    private unsafe struct WindowCompositionAttributeData
    {
        public WCA Attribute;
        public void* Data;
        public int DataLength;
    }

    private enum WCA
    {
        ACCENT_POLICY = 19
    }

    private enum ACCENT
    {
        DISABLED = 0,
        ENABLE_GRADIENT = 1,
        ENABLE_TRANSPARENTGRADIENT = 2,
        ENABLE_BLURBEHIND = 3,
        ENABLE_ACRYLICBLURBEHIND = 4,
        INVALID_STATE = 5
    }

    private struct AccentPolicy
    {
        public ACCENT AccentState;
        public uint AccentFlags;
        public uint GradientColor;
        public uint AnimationId;
    }
}
0 голосов
/ 06 июня 2019

Это очень сложно сделать. В DevExpress есть множество профессиональных программистов на C #.

Попробуйте переключиться на универсальное приложение для Windows. Там легче.

Существует руководство UWP: https://docs.microsoft.com/en-US/windows/uwp/get-started/universal-application-platform-guide

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...