2009-02-27 9 views
19

में डुप्लिकेट आइकन संसाधनों से बचें मैं विजुअल सी # 2008 एक्सप्रेस का उपयोग कर रहा हूं। मैं एप्लिकेशन के लिए एक ही आइकन का उपयोग करना चाहता हूं (यानी, .exe के लिए दिखाया गया आइकन), और मुख्य रूप के लिए। दुर्भाग्यवश, वीसी # इस बारे में बहुत स्मार्ट प्रतीत नहीं होता है, और आइकन डेटा को डुप्लिकेट करने पर जोर देता है।.NET (C#) प्रोजेक्ट

फॉर्म या प्रोजेक्ट आइकन (केवल फ़ाइल का चयन करने) में उपयोग के लिए "पहले से एम्बेडेड" आइकन चुनने का एक तरीका प्रतीत नहीं होता है, और दोनों आइकनों के लिए एक ही फ़ाइल का उपयोग करके फ़ाइल को दो बार एम्बेड करता है जहां तक ​​मैं देख सकता हूँ। यह एक बड़ा सौदा नहीं है (हार्ड ड्राइव स्पेस अब सस्ता है, है ना?), लेकिन यह मुझे खराब करता है।

कोई विचार यह कैसे बचें? फॉर्म का निर्माण होने पर उपयोग के लिए निष्पादन योग्य आइकन को प्रोग्रामेटिक रूप से लोड करने का कोई तरीका है, कहें? समान चीजों के बारे में कुछ फ़ोरम पोस्ट यह सुझाव देते हैं कि .NET संसाधन सामान्य पुराने विंडोज संसाधन प्रणाली का उपयोग नहीं करते हैं - पुराने शैली के संसाधनों को प्राप्त करने के ढांचे के भीतर से कोई तरीका है? या क्या मुझे Win32 API फ़ंक्शन को बाध्य करने के लिए बाध्य करना है?

+0

विरासत का उपयोग क्यों नहीं करें? आइकन को एक कस्टम फॉर्म क्लास में परिभाषित करें और इसे हर जगह उपयोग करें। –

+0

मुझे अपना डेल्फी प्रोग्रामिंग समय याद है ... self.Icon = Application.Icon; : पी ... .NET में बहुत मुश्किल: डी – Learner

+0

संभावित डुप्लिकेट [संसाधनों से आइकन का उपयोग करने का कोई आसान तरीका?] (Http: // stackoverflow।कॉम/प्रश्न/565680 9/किसी भी-आसान-तरीके-से-उपयोग-टू-टू-संसाधन) – KyleMit

उत्तर

6

हाँ, यह बहुत परेशान है। लेकिन Icon.ExtractAssociatedIcon के प्रस्तावित उत्तर के साथ समस्या यह है कि यह 32x32 आइकन पुनर्प्राप्त करेगा, और उसके बाद आपकी फॉर्म विंडो में या टास्कबार पर 16x16 आइकन पर डाउन नमूना होगा, जो तब तक भयानक लगेगा जब तक कि आपका 32x32 आइकन बहुत चालाकी से निर्मित न हो।

तरह से मैं यह कर रहा हूँ इंटरॉप (आपके प्रपत्र निर्माता में पहली पंक्ति डाल) के साथ है:

this.Icon = ExtractSmallIconFromLibrary(Application.ExecutablePath); 
... 

public static Icon ExtractSmallIconFromLibrary(string file) { 
    IntPtr[] reficon = new IntPtr[1]; 
    int nextracted = ExtractIconEx(file, 0, null, reficon, 1); 
    if (nextracted < 1) 
     return null; 
    Icon unmanaged_icon = Icon.FromHandle(reficon[0]); 
    Icon icon = (Icon)unmanaged_icon.Clone(); 
    DestroyIcon(unmanaged_icon.Handle); 
    return icon; 
} 

[DllImport("Shell32", CharSet = CharSet.Auto)] 
extern static int ExtractIconEx(
    [MarshalAs(UnmanagedType.LPTStr)] 
    string lpszFile, 
    int nIconIndex, 
    IntPtr[] phIconLarge, 
    IntPtr[] phIconSmall, 
    int nIcons 
    ); 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
extern static bool DestroyIcon(IntPtr handle); 

लेकिन यह नहीं महान है, या तो, जब से तुम 32x32 आइकन चाहते हो है Alt-Tab आइकन सूची जैसी चीज़ों के लिए। तो आपको वास्तव में संपूर्ण आइकन निकालने की आवश्यकता है, जो एक बड़ा काम है। शायद दो आइकनों को एक में गठबंधन करने का एक सीधा तरीका है। या आप इस codeproject प्रोग्राम की तरह ऐसा कर सकते हैं, जो कोड के एक बड़े ढेर के साथ पहली जगह में पूरे आइकन को निकालता है।

14

आप सही हैं, और यह बल्कि कष्टप्रद है।

आपको डिज़ाइनर-जेनरेट कोड पर भरोसा करने के बजाय स्वयं आइकन लोड करना होगा। एक परियोजना संसाधन के रूप में आइकन को बचाने, तो प्रपत्र के निर्माता में प्रपत्र के Icon संपत्ति में संसाधन लोड:

this.Icon = Properties.Resources.myIconResourceName; 
+0

यह हल नहीं करता है: आइकन को प्रोजेक्ट संसाधन के रूप में एम्बेड करना फॉर्म डिज़ाइनर में इसे सेट करने जैसा ही है - यह आइकन डेटा को डुप्लिकेट करता है, जो मैं बचने की कोशिश कर रहा हूं। –

+0

जब आप आइकन आइकन के रूप में आइकन जोड़ते हैं, तो इसे संसाधन के रूप में पहले ही एम्बेड किया जाना चाहिए, नहीं? –

+0

ऐसा नहीं है कि मैं देख सकता हूं ... निष्पादन योग्य के लिए उपयोग किया गया आइकन .NET संसाधन प्रणाली से पूरी तरह स्वतंत्र है। –

10

आप Icon.ExtractAssociatedIcon के लिए देख रहे हैं। अपने निष्पादन योग्य को पास करने के लिए कॉल करें:

var icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location); 
+5

कृपया समझाएं कि यह धीमा क्यों है? यदि ऐसा इसलिए है क्योंकि यह प्रतिबिंब का उपयोग कर रहा है जिसे आसानी से हल किया जा सकता है। असेंबली के बजाय एक्स्प्रेसेबलपैथ। GetExecutingAssembly()। स्थान। –

+0

बेस्ट सोल्यूशन! जो संसाधनों में आइकन डुप्लिकेट नहीं करते हैं और टास्कबार में सर्वश्रेष्ठ गुणवत्ता आइकन दिखाते हैं। धन्यवाद! – Geograph

1

मुझे एक ही समस्या थी।

मेरे पास है और exe आइकन मैं फ़ाइल आकार को बढ़ाए बिना सबफॉर्म के लिए पुन: उपयोग करना चाहता हूं।

//From MyApp 
MySubForm msf = new MySubForm(); 
msf.Icon = this.Icon; 
msf.Show(); 

मुझे नहीं पता कि यह उपयोगी है, लेकिन मैं इसे किसी भी तरह से साझा करना चाहता हूं।

3

मुझे लगता है कि डुप्लिकेट आइकन समेत कई मामलों में दिन के अंत में अप्रबंधित संसाधन से निकालने की कोशिश करने से अधिक कुशल होता है - क्योंकि आप यूएनसी पथों के लिए Icon.ExtractAssociatedIcon का उपयोग नहीं कर सकते हैं।