Rehber C# ile Windows tema rengine duyarlı yazılım geliştirme

Merhaba.

Bugün sizlere Windows tema rengine duyarlı yazılım nasıl geliştirilir bunu göstermeye çalışacağım.

1676135872749.png


Öncelikle yeni bir Form oluşturuyoruz.

1676135912918.png


Ardından bir Class ekliyoruz.

Ardından alt kısımda paylaştığım kodları bu Class içine ekliyoruz.


C#:
using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace WindowsAccentColors_TS{
    public class ExtLibrary{
        // EXTERN METHODS
        // NOT: UXTHEME.DLL dosyası Windows 10 ve 11'de mevcuttur.
        // ============================================================================
        [DllImport("uxtheme.dll", EntryPoint = "#95")]
        private static extern uint GetImmersiveColorFromColorSetEx(uint dwImmersiveColorSet, uint dwImmersiveColorType, bool bIgnoreHighContrast, uint dwHighContrastCacheMode);
        [DllImport("uxtheme.dll", EntryPoint = "#96")]
        private static extern uint GetImmersiveColorTypeFromName(IntPtr pName);
        [DllImport("uxtheme.dll", EntryPoint = "#98")]
        private static extern int GetImmersiveUserColorSetPreference(bool bForceCheckRegistry, bool bSkipCheckOnFail);
        // PUBLIC METHODS
        // ============================================================================
        public static Color GetAccentColor(){
            var userColorSet = GetImmersiveUserColorSetPreference(false, false);
            var colorType = GetImmersiveColorTypeFromName(Marshal.StringToHGlobalUni("ImmersiveStartSelectionBackground"));
            var colorSetEx = GetImmersiveColorFromColorSetEx((uint)userColorSet, colorType, false, 0);
            return ConvertDWordColorToRGB(colorSetEx);
        }
        // PRIVATE METHODS
        // ============================================================================
        private static Color ConvertDWordColorToRGB(uint colorSetEx){
            byte redColor = (byte)((0x000000FF & colorSetEx) >> 0);
            byte greenColor = (byte)((0x0000FF00 & colorSetEx) >> 8);
            byte blueColor = (byte)((0x00FF0000 & colorSetEx) >> 16);
            return Color.FromArgb(redColor, greenColor, blueColor);
        }
    }
}

Forumuzun tasarımı bu şekilde.
  • 1 adet Panel.
  • 1 adet Buton.
Form'a çift tıklayıp kod kısmını açıyoruz.

Global alana bir
Event Handler tanımlıyoruz.

C#:
private UserPreferenceChangedEventHandler UserPreferenceChanged;

Form'umuz işlem kısmını bu şekilde gerekli parametreleri giriyoruz.

C#:
public Form1(){
            InitializeComponent();
            LoadThemes();
            UserPreferenceChanged = new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
            SystemEvents.UserPreferenceChanged += UserPreferenceChanged;
            this.Disposed += new EventHandler(Form_Disposed);
        }

"LoadThemes" isminde bir Void oluşturdum ben. Siz istediğiniz isim ile oluşturabilirsiniz.

C#:
private void LoadThemes(){
            var themeColor = ExtLibrary.GetAccentColor();// WINDOWS TEMA RENGI == OLUŞTURDUĞUNUZ CLASS ISMI NE ISE BURAYI O ISIM ILE DEGISTIRIN.
            var lightColor = ControlPaint.Light(themeColor);
            var darkColor = ControlPaint.Dark(themeColor);
            panel1.BackColor = themeColor;
            button1.BackColor = darkColor;
            // BUTTONS
            // ============================================================================
            foreach (Button button in this.Controls.OfType<Button>()){
                button.BackColor = themeColor;
            }
            foreach (Button button in this.panel1.Controls.OfType<Button>()){
                button.FlatAppearance.MouseOverBackColor = themeColor;
                button.FlatAppearance.MouseDownBackColor = lightColor;
            }
        }

Windows rengi değiştiği anda dinamik olarak ekranda göstermek için gerekli son kodlarımızı giriyoruz.

C#:
  private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e){
            if (e.Category == UserPreferenceCategory.General || e.Category == UserPreferenceCategory.VisualStyle){
                LoadThemes();
            }
        }
        private void Form_Disposed(object sender, EventArgs e){
            SystemEvents.UserPreferenceChanged -= UserPreferenceChanged;
        }

1676135647188.png


1676135672595.png


Artık Windows rengi değiştiği anda ekrandaki öğelerin renkleri değişecek.

Not: Windows 10 ve 11 de çalışmaktadır.

Kolay gelsin, başarılar :)
 
Son düzenleme:

Yeni konular

Geri
Yukarı