2017-11-27 22 views
5

की अनुक्रमणिका के लिए मानक विंडोज़ जानकारी आइकन को अच्छी तरह से कैसे पेंट करें I पृष्ठ नियंत्रण के एक टैब के सूचकांक में चित्रित मानक विंडोज़ जानकारी (और चेतावनी और त्रुटि) आइकन चाहते हैं। हालांकि यदि पृष्ठभूमि पृष्ठभूमि रंग सफेद नहीं है तो परिणाम खराब दिख रहा है। enter image description hereपृष्ठ नियंत्रण के टैब

आप देख सकते हैं सफेद सीमा अस्पष्ट है, मैं इसे TImageList द्वारा उचित अल्फा पारदर्शिता की कमी की वजह है लगता है, लेकिन मैं कैसे ठीक करने के लिए पता नहीं है:

program Project111; 

uses 
    Vcl.Forms, 
    Vcl.Controls, 
    Vcl.Graphics, 
    Winapi.Windows, 
    Vcl.ComCtrls, 
    Vcl.ImgList; 

{$R *.res} 

var 
    mainForm: TForm; 
    imageList: TImageList; 
    icon: TIcon; 
    pageControl: TPageControl; 
    tabSheet: TTabSheet; 
begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 

    Application.CreateForm(TForm, mainForm); 

    imageList := TImageList.Create(mainForm); 
    imageList.ColorDepth := cd32bit; 
    icon := TIcon.Create; 
    try 
    icon.Handle := LoadImage(0, IDI_INFORMATION, IMAGE_ICON, 16, 16, {LR_DEFAULTSIZE or} LR_SHARED); 
    imageList.AddIcon(icon); 
    finally 
    icon.Free; 
    end; 

    pageControl := TPageControl.Create(mainForm); 
    pageControl.Parent := mainForm; 
    pageControl.Images := imageList; 

    tabSheet := TTabSheet.Create(mainForm); 
    tabSheet.Parent := pageControl; 
    tabSheet.PageControl := pageControl; 
    tabSheet.ImageIndex := 0; 

    Application.Run; 
end. 

यहाँ एक स्क्रीनशॉट है इस।

समाधान को TImageList का उपयोग करने की आवश्यकता नहीं है, मुझे किसी अन्य दृष्टिकोण का उपयोग करने में खुशी है। ध्यान दें कि कैप्शन भी होंगे और सभी इंडेक्स में आइकन नहीं होंगे और संदर्भ परिवर्तन के रूप में आइकन बदल सकते हैं/जोड़े/हटा दिए जा सकते हैं।

मैं डेल्फी एक्सई -2 का उपयोग कर रहा हूं, अगर मेरे पास मदद करता है तो मेरे पास DevExpress घटक भी हैं।

+0

की अपेक्षा इस बहुत बड़े पैमाने पर किया जाना है। छवियों को स्वयं कैसे बनाया गया था, इसकी प्रकृति मानती है कि उनका उपयोग हल्के पृष्ठभूमि पर किया जाएगा। समस्या वास्तविक छवियों में है। ज्यादा कोड इसे ठीक नहीं कर सकता है। फिक्स एक अंधेरे पृष्ठभूमि पर उपयोग के लिए अनुकूलित छवि प्रदान करना है। या बेहतर अभी तक, हमने इस सटीक कारण के लिए वेक्टर फ़ॉन्ट होने के लिए हमारे सॉफ़्टवेयर में सभी बटन और आइकन अपडेट करने में आधा साल बिताया है। अब हम किसी भी पृष्ठभूमि पर जो कुछ भी चाहते हैं उसे रंगीन कर सकते हैं। –

उत्तर

6

@Sertac कहते हैं आप 32x32 से 16x16 को खिड़कियां खोल आइकन आकार बदलने का असर है क्या देखते हैं, समाधान के रूप में Windows Vista के साथ शुरू आप SHGetStockIconInfo फ़ंक्शन का उपयोग कर सकते हैं। SHGSI_SMALLICON ध्वज को आइकन के छोटे संस्करण को पुनर्प्राप्त करने के लिए पास करता है, जैसा कि SM_CXSMICON और SM_CYSMICON द्वारा निर्दिष्ट किया गया है।

SM_CXSMICON और SM_CYSMICON के मान वर्तमान डीपीआई सेटिंग पर निर्भर करता है। डीपीआई 96 के लिए 16x16 है।

नमूना

LIcon := TIcon.Create; 
    try 
    LIcon.Handle := 0; 
    if TOSVersion.Check(6, 0) then 
    begin 
     ZeroMemory(@LSHStockIconInfo, SizeOf(LSHStockIconInfo)); 
     LSHStockIconInfo.cbSize := sizeof(LSHStockIconInfo); 
     if SHGetStockIconInfo(SIID_INFO, SHGSI_ICON or SHGSI_SMALLICON, LSHStockIconInfo) = S_OK then 
     begin 
     LIcon.Handle := LSHStockIconInfo.hIcon; 
     imageList.AddIcon(LIcon); 
     end; 
    end; 
    finally 
    LIcon.Free; 
    end; 
3

जो आप देखते हैं वह टूटा अल्फा पारदर्शिता लेकिन एक आकार बदलने वाला आर्टिफैक्ट की वजह से नहीं है।

documented के रूप में, एक आइकन LoadImage भार का डिफ़ॉल्ट आकार SM_CXICON एक्स SM_CYICON, जो आम तौर 32x32 है। चूंकि आप सिस्टम द्वारा साझा किए गए आइकन का अनुरोध कर रहे हैं, यह आइकन का आकार होगा जो दिया जाएगा।

अगर यह अपने कोड में ऐसा है तो आपको सत्यापित कर सकते हैं:

.. 
    try 
    icon.Handle := LoadImage(0, IDI_INFORMATION, IMAGE_ICON, 16, 16, {LR_DEFAULTSIZE or} LR_SHARED); 
    Assert(icon.Width = GetSystemMetrics(SM_CXICON)); 
    Assert(GetSystemMetrics(SM_CXICON) <> 16); 
    .. 

क्या इस प्रकार है कि आइकन शायद COLORONCOLOR मोड के साथ StretchBlt की तुलना में बेहतर कुछ भी नहीं द्वारा छवि सूची फिट करने के लिए आकार दिया जाता है।

दुर्भाग्य से यह एक गैर मानक आकार के साथ एक प्रणाली आइकन लोड करने के लिए है, क्योंकि के रूप में फिर से प्रलेखित,

जब एक प्रणाली चिह्न या कर्सर लोड हो रहा है, तो आप LR_SHARED या का उपयोग करना चाहिए संभव नहीं है समारोह संसाधन लोड करने में विफल हो जाएगा।


आप क्या करने की जरूरत है अपने डिफ़ॉल्ट आकार के साथ साझा आइकन लोड और फिर इसे आकार बदलने के लिए एक बेहतर एल्गोरिथ्म का उपयोग कर अपने आप को 16x16 करने के लिए है। StretchBltHALFTONE के साथ शायद बेहतर होगा लेकिन अधिक उन्नत ग्राफिक्स लाइब्रेरी का उपयोग करके सर्वोत्तम परिणाम मिल सकते हैं।

एक दृढ़ता से निराश विकल्प संसाधन को सीधे जहां से रहता है उसे लोड करना है। यदि आप LR_SHARED ध्वज का उपयोग नहीं करते हैं तो आपको अनुरोध आकार दिया जाएगा। आइकन की वास्तविक अनुक्रमणिका को खोजने के लिए आपको कुछ शोध करने की आवश्यकता है क्योंकि यह दस्तावेज नहीं है। और इस बात पर विचार करने की आवश्यकता है कि सूचकांक या जहां यह रहता है समय में बदल सकता है। इस मामले में खुद को आइकन को नष्ट करना न भूलें क्योंकि सिस्टम गैर-साझा संसाधन के लिए ऐसा नहीं करेगा।

icon.Handle := LoadImage(GetModuleHandle(user32), Pointer(104), IMAGE_ICON, 16, 16, 0); 
संबंधित मुद्दे