2011-01-10 13 views
9

बिल्डिंग हाल ही में मैं अपने रंग और चमक मूल्य के आधार पर एक .NET रंग चार्ट में आया था। मुझे क्या स्ट्रोक पागल ग्रेस्केल चार्ट है। उदाहरण के लिए, डार्कग्रे वास्तव में ग्रे के बाद हल्का है? इसके अलावा, मैं आरजीबी मूल्यों के क्रम में कोई तर्क नहीं देख सकता, यह 0 से 105 से 128 तक जाता है?ग्रेस्केले ब्रश क्लास

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

कैसे करना है:

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

क्या मैं चाहता हूँ एक GrayScaleBrushes वर्ग जो वास्तव में ब्रश वर्ग की तरह बर्ताव करता है, लेकिन अपने कस्टम योजना के साथ, की तरह है कि, यह सुनिश्चित कर लें कि ब्रश सही ढंग से निपटान करेंगे?

संपादित करें: .NET ब्रश क्लास निम्न जैसा दिखता है (परावर्तक का उपयोग करके अलग किया गया)।

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; 
     } 
    } 
} 

सुरक्षितनेट मोड मेरे लिए पहुंच योग्य नहीं लगता है। मान लीजिए कि मैंने एक स्थिर विधि में एक सॉलिड ब्रश वापस कर दिया है, क्या इससे सबकुछ ठीक से निपट सकता है? (और है कि परीक्षण करने के लिए कैसे?)

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

कारण 'डार्कग्रे> ग्रे' के कारण, विकिपीडिया देखें: http://en.wikipedia.org/wiki/X11_color_names#Color_names_that_clash_between_X11_and_HTML.2FCSS –

उत्तर

1

SafeNativeMethods इस मामले में बस एक साधारण कैश है जो ब्रश की प्रतिलिपि रखता है। तो संपत्ति गेटटर को दूसरी कॉल एक नया उदाहरण नहीं बनाएगी। इसके बजाय यह हमेशा एक ही ब्रश वापस कर देगा।

इसे पूरा करने के आप इस तरह हो सकता है आपके समारोह को फिर से लिखने सकता है:

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); 
    } 
} 

यह समाधान की जरूरत के रूप में लेकिन null हर बार यह कहा जाता है के लिए जाँच की लागत से ग्रे तराजू पैदा करेगा। आप इसे फिर से इस तरह एक दृष्टिकोण लेने के द्वारा एक स्मृति समस्या बदलकर इस गति समस्या पूरा कर सकते हैं:

public static class GrayScaleBrushes 
{ 
    public static readonly SolidBrush Pct05; 

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

लेकिन मैं इस मामले में लगता है कि यह सिर्फ स्वाद, कारण है और न ही गति है और न ही की बात दोनों मामलों में स्मृति एक वास्तविक समस्या होगी।

1

Brushes वर्ग केवल परिभाषित तो बस जाने उन संसाधनों आवेदन बाहर निकलने पर साफ किया जा रंग की संख्या के लिए इसी संसाधनों की एक छोटी संख्या लीक कर सकते हैं स्थिर है। इसके बजाय यह सुनिश्चित करने के साथ स्वयं को चिंता करें कि आपके ब्रश वास्तव में तब तक नहीं बनाए जाते जब तक कि उनका संदर्भ न हो। इससे स्टार्टअप तेज हो जाएगा और यह सुनिश्चित होगा कि अप्रयुक्त रंग संसाधनों का उपभोग नहीं करेंगे।

1

मैं निम्नलिखित की सिफारिश करेंगे:

एक स्थिर वर्ग GrayScaleBrushes बनाएं

तीव्रता प्रतिशत (int) कुंजी के रूप में के साथ की एक स्थिर शब्दकोश बनाएँ,

बनाएं एक भी स्थिर इंडेक्स्ड संपत्ति ' पीटीसी 'है कि आप ग्रेस्केलब्रश.पीक्ट [10] जैसे प्रयोग करेंगे जो शब्दकोश प्रविष्टि वापस कर देगा।

अब आप ओलिवर के रूप में ऐसा कर सकते हैं और फ्लाई पर शब्दकोश प्रविष्टियां बना सकते हैं, या आप 20 प्रविष्टियों के माध्यम से लूप के लिए एक स्थिर कन्स्ट्रक्टर का उपयोग कर सकते हैं और उन्हें शब्दकोश में जोड़ सकते हैं।

यह विधि आपको 20 अजीब गुणों को बनाने और बनाए रखने से बचाती है। चीयर्स।

संबंधित मुद्दे