- 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.
Proje
Kod kullanarak da aynı görünüme sahip olabiliriz ama gereksiz bir kullanım bana kalırsa.
Çözüm gezginine gelip bir adet Class ekliyoruz.
Class'a
Eklediğimiz Class'ın erişebilirliğini
Yeni bir
Yapıları yazıyoruz.
Projeye
Son olarak
Şimdi oluşturduğumuz bu Class'ı form içerisinde çağırıyoruz. Label rengini değiştirmeyi unutmayın.
Formu sürüklemek istiyorsanız bir adet Class daha ekleyin.
Ben Class'a
İşlem bitikten sonra Form'un
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.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;
Çözüm gezginine gelip bir adet Class ekliyoruz.
Class'a
Glass Effect adını verdim. Siz daha farklı bir isim kullanabilirsiniz.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;
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");
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);
}
İşlem bitikten sonra Form'un
MouseMove Event'inde Class'ımızı çağırıyoruz.
C#:
DragdropClass.DragdropAdd(this);