Rehber C# Form Glass Effect yapımı

Katılım
22 Temmuz 2019
Mesajlar
1.839
Makaleler
2
Çözümler
23
Merhabalar;
Bugün bir programı şık gösteren glass yani cam görünümünün yapımını sıfırdan basit bir şekilde anlatacağım.
Windows 11'de test edilmiştir.
Windows 11'den düşük işletim sistemlerinde form oluşturma yöntemi farklı olduğu için aynı görünüme sahip olmayabilir.


Bir adet proje oluşturuyor veya var olan projemizin üzerinden devam ediyoruz.
Hesap_Makinem adında bir proje oluşturdum.

1669612663227.png


Proje ControlBox'ını kapatıyoruz ve ardından Proje Text'ini siliyoruz.
Kod kullanarak da aynı görünüme sahip olabiliriz ama gereksiz bir kullanım bana kalırsa.
C#:
this.Text = string.Empty;
this.ControlBox = false;


1669613349589.png
1669612962128.png


Çözüm gezginine gelip bir adet Class ekliyoruz.
Class'a Glass Effect adını verdim. Siz daha farklı bir isim kullanabilirsiniz.

1669613809748.png


Eklediğimiz Class'ın erişebilirliğini public yapabilirsin veya internal'de kalsa sorun olmaz.
Yeni bir using yöntemi ekliyoruz ve gereksiz using yöntemlerini kaldırıyoruz.

C#:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

1669614581163.png


Yapıları yazıyoruz.

C#:
#region Structures

        internal enum AccentState
        {
            ACCENT_DISABLED = 0,
            ACCENT_ENABLE_GRADIENT = 1,
            ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
            ACCENT_ENABLE_BLURBEHIND = 3,
            ACCENT_ENABLE_ACRYLICBLURBEHIND = 4,
            ACCENT_INVALID_STATE = 5
        }

        [StructLayout(LayoutKind.Sequential)]
        internal struct AccentPolicy
        {
            public AccentState AccentState;
            public uint AccentFlags;
            public uint GradientColor;
            public uint AnimationId;
        }

        [StructLayout(LayoutKind.Sequential)]
        internal struct WindowCompositionAttributeData
        {
            public WindowCompositionAttribute Attribute;
            public IntPtr Data;
            public int SizeOfData;
        }

        internal enum WindowCompositionAttribute
        {
            WCA_ACCENT_POLICY = 19
        }

        #endregion


Projeye user32.dll ekliyoruz.

C#:
#region Private

[DllImport("user32.dll")]
private static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data);

    #endregion

Son olarak EnableBlur void'ini ve Form_Resize'ini ekliyoruz

C#:
#region public

        public void EnableBlur(Form formName, uint _blurOpacity,string color)
        {
            var accent = new AccentPolicy
            {
                AccentState = AccentState.ACCENT_ENABLE_ACRYLICBLURBEHIND,
                GradientColor = (_blurOpacity << 24) | (0x990000 & 0xFFFFFF)
            };
            var accentStructSize = Marshal.SizeOf(accent);
            var accentPtr = Marshal.AllocHGlobal(accentStructSize);
            Marshal.StructureToPtr(accent, accentPtr, false);
            var data = new WindowCompositionAttributeData
            {
                Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY,
                SizeOfData = accentStructSize,
                Data = accentPtr
            };
            SetWindowCompositionAttribute(formName.Handle, ref data);
            Marshal.FreeHGlobal(accentPtr);
            formName.BackColor = System.Drawing.ColorTranslator.FromHtml(color);
            formName.Resize += FormName_Resize;
        }

        private void FormName_Resize(object sender, EventArgs e)
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }

        #endregion

Şimdi oluşturduğumuz bu Class'ı form içerisinde çağırıyoruz. Label rengini değiştirmeyi unutmayın.

C#:
(new Glass_Effect()).EnableBlur(this, 0, "#010000");

1669615333164.png


1669615587383.png


Formu sürüklemek istiyorsanız bir adet Class daha ekleyin.
Ben Class'a DragdropClass adını verdim. Kodlarımız ve using'ler bu şekilde olacak.

C#:
using System.Runtime.InteropServices;
using System.Windows.Forms;

C#:
[DllImport("user32.DLL", EntryPoint = "ReleaseCapture")]
        private extern static void ReleaseCapture();
        [DllImport("user32.DLL", EntryPoint = "SendMessage")]
        private extern static void SendMessage(System.IntPtr hWnd, int wMsg, int wParam, int lParam);

        public static void DragdropAdd(Form formName)
        {
            ReleaseCapture();
            SendMessage(formName.Handle, 0x112, 0xf012, 0);
        }


1669615775637.png


İşlem bitikten sonra Form'un MouseMove Event'inde Class'ımızı çağırıyoruz.

C#:
DragdropClass.DragdropAdd(this);

1669616082281.png
1669615963462.png
 

Dosya Ekleri

  • 1669613326510.png
    1669613326510.png
    2,5 KB · Görüntüleme: 36
  • 1669616078826.png
    1669616078826.png
    20,7 KB · Görüntüleme: 38

Technopat Haberler

Yeni konular

Geri
Yukarı