2011-01-10 20 views
9

Geçtiğimiz günlerde renk ve parlaklık değerlerine bağlı olarak bir .NET renk şemasıyla karşılaştım. Bana inme, çılgın gri tonlamalı grafik. Örneğin, DarkGray aslında daha açık gri mi? Ayrıca, rgb değerlerinin derecelendirilmesinde herhangi bir mantık göremiyorum, 0'dan 105 ila 128'ye gider?GrayScaleBrushes sınıfı oluşturma

GrayScaleBrushes.Pct05 
GrayScaleBrushes.Pct10 
GrayScaleBrushes.Pct15 
..all the way to.Pct95 
... 
ie: e.FillRectangle(GrayScaleBrushes.Pct05, exampleRect); 

Nasıl yapmalı:

0 : Black 
105 : DimGray 
128 : Gray 
169 : DarkGray! 
192 : Silver 
211 : LightGray 
220 : Gainsboro 
245 : Ghostwhite 
255 : White 

http://sites.google.com/site/cdeveloperresources/

color chart - see link above

İstediğim tam olarak olduğu gibi Fırçalar sınıf gibi davranır, ancak benim özel şeması ile GrayScaleBrushes sınıftır Bu, fırçaların doğru şekilde atıldığından emin olmak?

Düzenleme: .NET Fırçaları sınıfı aşağıdaki gibi görünür (yansıtıcı kullanılarak demonte edilir).

public sealed class Brushes 
{ 
    // Fields 
    private static readonly object AliceBlueKey = new object(); 

    // Methods 
    private Brushes() 
    { 
    } 

    // Properties 
    public static Brush AliceBlue 
    { 
     get 
     { 
      Brush brush = (Brush) SafeNativeMethods.Gdip.ThreadData[AliceBlueKey]; 
      if (brush == null) 
      { 
       brush = new SolidBrush(Color.AliceBlue); 
       SafeNativeMethods.Gdip.ThreadData[AliceBlueKey] = brush; 
      } 
      return brush; 
     } 
    } 
} 

SafeNativeMethods, bana erişilemez gibi görünüyor. Bir SolidBrush'ı statik bir yöntemle döndürdüğümü varsayalım, bu herşeyin doğru şekilde atılmasını sağlar mı? (Ve bu nasıl test?)

public sealed class GrayScaleBrushes 
{ 
    private static SolidBrush pct05 = null; 

    public static SolidBrush Pct05 
    { 
     get 
     { 
      if (pct05 == null) 
      { 
       int rgbVal = GetRgbValFromPct(5); 
       pct05 = new SolidBrush(Color.FromArgb(rgbVal, rgbVal, rgbVal)); 
      } 
      return pct05; 
     } 
    } 

    private static int GetRgbValFromPct(int pct) 
    { 
     return 255 - (int)(((float)pct/100f) * 255f); 
    } 
} 
+8

"DarkGray> Gray" nedeniyle, bkz .: Wikipedia: http://en.wikipedia.org/wiki/X11_color_names#Color_names_that_clash_between_X11_and_HTML.2FCSS –

cevap

1

SafeNativeMethods, bu durumda, fırçanın bir kopyasını tutan basit bir önbellektir. Bu nedenle, mülk sahibine ikinci bir çağrı yeni bir örnek oluşturmaz. Bunun yerine her zaman aynı fırçayı döndürür.

public static class GrayScaleBrushes 
{ 
    private static SolidBrush _Pct05; 

    public static SolidBrush Pct05 
    { 
     get 
     { 
      if (_Pct05 == null) 
      { 
       var value = GetRgbValFromPct(5); 
       _Pct05 = new SolidBrush(Color.FromArgb(value, value, value)); 
      } 

      return _Pct05; 
     } 
    } 

    private static int GetRgbValFromPct(int pct) 
    { 
     // no need to convert to float and back to int again 
     return 255 - ((pct * 255)/100); 
    } 
} 

Bu çözüm gerektiği gibi ama null denir her zaman kontrol maliyetleri ile gri ölçekler oluşturur:

böyle belki işlevini yeniden olabilir Bunu gerçekleştirmek için. Böyle bir yaklaşım alarak tekrar bir hafıza problemi bunu değiştirerek bu hız sorunu başarabilirsiniz:

public static class GrayScaleBrushes 
{ 
    public static readonly SolidBrush Pct05; 

    static GrayScaleBrushes() 
    { 
     var value = GetRgbValFromPct(5); 
     Pct05 = new SolidBrush(Color.FromArgb(value, value, value)); 
    } 
} 

Ama bu durumda tat, neden ne hız ne de sadece meselesi düşünüyorum Her iki durumda da bellek gerçek bir problem olacaktır.

1

Brushes sınıf yalnızca bu yüzden sadece bu kaynaklar uygulama çıkarken temizlenmelidir izin tanımlanan renklerin sayısına karşılık gelen kaynakların az sayıda sızıntı olabilir statiktir. Bunun yerine, fırçalarınızın referans alınmadıkça gerçekte oluşturulmadığından emin olmayla ilgilenin. Bu, başlatmayı hızlandıracak ve kullanılmayan renklerin kaynakları tüketmediğinden emin olacaktır.

1

aşağıdaki öneriyoruz:

statik sınıf GrayScaleBrushes oluşturun

oluşturma anahtar olarak yoğunluk yüzdesi (int) ile statik Sözlüğü oluşturun tek bir statik Endeksli Mülkiyet ' Pct ', GrayScaleBrushes.Pct [10] gibi kullanmak istediğiniz sözlük girişini döndürür.

Artık Oliver'ın söylediği gibi sözlük girişlerini oluşturduğu gibi yapabildiğiniz gibi, ya da 20 girdiler arasında geçiş yapmak ve bunları sözlüğe eklemek için statik bir kurucu kullanabilirsiniz.

Bu yöntem, 20 garip özellik oluşturmanıza ve korumanıza gerek kalmadan sizi yüksek oranda korur. Şerefe.