Загрузка...

[C#] Делаем Aero эффект на форме

Тема в разделе C# создана пользователем r3xq1 19 дек 2020. 302 просмотра

  1. r3xq1
    r3xq1 Автор темы 19 дек 2020 https://t.me/DarkSoft_Extra 119 27 июл 2018
    Создаём обычную форму, кинем на неё две кнопки.
    Создаём класс: Structures.cs и запишем туда такой код:
    Код
    namespace GlassEffectAero
    {
    using System;

    internal static class Structures
    {
    public struct DwmBlurbehind
    {
    public int DwFlags;
    public bool FEnable, FTransitionOnMaximized;
    public IntPtr HRgnBlur;
    }
    }
    }
    Теперь создадим класс: NativeMethods.cs и запишем туда такой код:
    Код
    namespace GlassEffectAero
    {
    using System;
    using System.Runtime.InteropServices;

    internal static class NativeMethods
    {
    [DllImport("gdi32")]
    internal static extern IntPtr CreateEllipticRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);

    [DllImport("dwmapi")]
    internal static extern int DwmEnableBlurBehindWindow(IntPtr hWnd, ref Structures.DwmBlurbehind pBlurBehind);
    }
    }
    На главную форму впишем такой код:
    Код
    namespace GlassEffectAero
    {
    using System;
    using System.Drawing;
    using System.Windows.Forms;

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

    // Переменная для управления перерисовки по кнопкам
    bool status_click = false;

    protected override void OnPaint(PaintEventArgs e)
    {
    if (Environment.OSVersion.Version.Major >= 6)
    {
    base.OnPaint(e);
    using (Brush brush = new SolidBrush(status_click ? Color.FromKnownColor(KnownColor.ControlLight) : Color.Black))
    {
    e?.Graphics?.FillRectangle(brush, ClientRectangle);
    }

    IntPtr hr = NativeMethods.CreateEllipticRgn(0, 0, Width, Height);
    var dbb = new Structures.DwmBlurbehind
    {
    FEnable = !status_click,
    DwFlags = 1,
    HRgnBlur = hr,
    FTransitionOnMaximized = false
    };

    NativeMethods.DwmEnableBlurBehindWindow(Handle, ref dbb);
    }
    }

    private void AeroFrm_Load(object sender, EventArgs e)
    {
    DoubleBuffered = false;
    status_click = true;
    this.Invalidate();
    }

    private void AeroActive_Click(object sender, EventArgs e)
    {
    status_click = false; // Ставим false при клике
    ActiveControl = null; // Уберает фокус с контрола
    this.Invalidate(); // Перерисовываем
    }

    private void AeroDeactive_Click(object sender, EventArgs e)
    {
    status_click = true; // Ставим true при клике
    ActiveControl = null; // Уберает фокус с контрола
    this.Invalidate(); // Перерисовываем
    }
    }
    }
    Результат:

    [IMG]
     
  2. itstranger
    itstranger 19 дек 2020 13 19 апр 2020
    Крутая штука. Спасибо за инфу. :PepeRich:
     
  3. XMineLGrifs
    XMineLGrifs 27 дек 2020 3 25 дек 2020
    круто, но WPF для этих целей лучше подходит.
    --- Сообщение объединено с предыдущим 27 дек 2020
    хотя спс. Пригодится. Я под WPF толком не кодил. По этому сяб за инфу.
     
Загрузка...
Top