Rehber C# üşengeçler için hızlı tema ayarı

Crypto Guard

Hectopat
Katılım
22 Temmuz 2019
Mesajlar
1.719
Makaleler
2
Çözümler
22
Bu kodun temel amacı, uygulamaya hızlıca koyu ve aydınlık tema desteği eklemektir. Ancak, bu hızlı implementasyon bazı eksikliklere sahiptir. Örneğin, şu anda birden fazla temayı desteklememekte ve sadece beyaz ve siyah tonlarında çalışacak şekilde ayarlanmıştır.
Kodu ben yazdım, bu nedenle bazı hatalar olabilir. Kendi ihtiyaçlarınıza göre geliştirmeler yapabilirsiniz.
Ekstra bilgi: Nesnenin arka plan rengini değiştirmek istemiyorsanız transparan yapın.

Kod;

C#:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace MicroDesign
{
    public class ThemeProcessor
    {
        public void Theme(Control control, int sign, int value)
        {
            try
            {
                if (control == null || control.IsDisposed)
                    return;

                ApplyThemeToControl(control, sign, value);

                foreach (Control childControl in control.Controls)
                {
                    if (childControl is PictureBox pictureBox && pictureBox.BackgroundImage != null)
                    {
                        ApplyThemeToPictureBox(pictureBox, sign, value);
                    }

                    Theme(childControl, sign, value);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error in Theme processing: {ex.Message}");
            }
        }

        private void ApplyThemeToControl(Control control, int sign, int value)
        {
            if (control.BackColor != Color.Transparent)
            {
                control.BackColor = ModifyColor(control.BackColor, sign, value);
            }

            control.ForeColor = ModifyColor(control.ForeColor, -sign, value);
        }

        private void ApplyThemeToPictureBox(PictureBox pictureBox, int sign, int value)
        {
            try
            {
                if (pictureBox == null || pictureBox.IsDisposed || pictureBox.BackgroundImage == null)
                    return;

                Bitmap bitmap = new Bitmap(pictureBox.BackgroundImage);

                for (int x = 0; x < bitmap.Width; x++)
                {
                    for (int y = 0; y < bitmap.Height; y++)
                    {
                        Color pixelColor = bitmap.GetPixel(x, y);

                        if (sign == -1 && pixelColor != Color.Transparent && pixelColor.ToArgb() == Color.Black.ToArgb())
                        {
                            bitmap.SetPixel(x, y, Color.White);
                        }
                        else if (sign == 1 && pixelColor != Color.Transparent && pixelColor.ToArgb() == Color.White.ToArgb())
                        {
                            bitmap.SetPixel(x, y, Color.Black);
                        }
                    }
                }

                pictureBox.BackgroundImage = bitmap;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error in ApplyThemeToPictureBox: {ex.Message}");
            }
        }

        private Color ModifyColor(Color oldColor, int sign, int value)
        {
            int red = Math.Max(0, Math.Min(255, oldColor.R + sign * value));
            int green = Math.Max(0, Math.Min(255, oldColor.G + sign * value));
            int blue = Math.Max(0, Math.Min(255, oldColor.B + sign * value));

            return Color.FromArgb(oldColor.A, red, green, blue);
        }
    }
}

Kullanımı;

C#:
ThemeProcessor themeProcessor = new ThemeProcessor();

private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
    if (checkBox2.Checked == false)
    {
        themeProcessor.Theme(this, 1, 180);
    }
    else
    {
        themeProcessor.Theme(this, -1, 180);
    }
}

Görseler;

1700073796547.png


1700073806416.png
 
Son düzenleme:
Kodu yeniden paylaşmalısın. Bu sefer paylaştığında "Yazım denetimi" kullanma ama. Kod okunabilir olmaktan çok uzak. Blokları ayırt etmek için dikkatli okumak gerekiyor.
 

Geri
Yukarı