2010-06-16 5 views
6

나는이 (단순) 하나를위한 시간을 spended했고 해결책을 찾을 수없는 '파괴'. ImageList는 툴바에 할당됩니다. 디자인 타임에 ImageList를 채울 때 부분 투명도가있는 아이콘이 잘 보입니다. 하지만 런타임에이 파일을 채울 필요가 있습니다.이 작업을 수행하면 아이콘이 꽤 엿 보입니다. 부분적으로 투명성이 느슨합니다.델파이 런타임시 아이콘과 이미지리스트를 채우기 투명성

같은 결과로 .res 파일에서 아이콘을로드하려고했습니다. 제 3 자 이미지 목록도 성공하지 못했습니다.)

편집, 모든/ 감사 2 :

것은 내가 잘 모릅니다 솔직히 정확히 무슨 일 나는 내가 할 수있는 어떤 단서가 없다.

아이콘 디자인 타임에 추가 : alt text http://shs-it.de/tmp/icon-runtime.JPG

귀하의 의견 는 알파 블렌딩 단지 지원되지 않습니다 : alt text http://shs-it.de/tmp/icon-designtime.JPG

아이콘이 실행시에 추가 된 알파 블렌딩은 correkt 용어입니다 ... 다음은 2 screenies 있습니다 해결책을 가져 왔습니다 : 편집기에서 이미지를 편집하고 "알파 블렌딩"픽셀을 제거했습니다. 이제는 괜찮습니다. 그러나 아이콘이 디자인 타임 대신 런타임에 추가 될 때 다른 아이콘이 보이게하는 것은 여전히 ​​이상합니다. 당신 (또는 다른 사람;)이 그것을 설명 할 수 있다면, 나는 행복 할 것이다;) 당신을 지원해 주셔서 감사합니다!

+1

부분 투명성 : –

+0

@Lars : 아마도 컬러 키 투명성을 의미합니다. –

+0

.ico 파일 또는 .bmp 파일을 사용하고 있습니까? –

답변

0

2 년 전 똑같은 문제가있었습니다. 델파이 문제입니다. 디자인 타임에 이미지를 목록에 올리는 작업을 끝내었지만 실제로는 그렇게하고 싶지 않았습니다. 또한 최상의 결과를 얻고 32 비트 컬러 이미지를 사용하려면 DevExpress 이미지 목록을 사용해야했습니다.

0

제레미 (Jeremy)는 실제로 이것이 델파이의 한계라고 말했습니다.

버튼 (내 경우에는 알파 투명도가있는 PNG) 위에 놓았던 이미지에 사용 된 하나의 해결 방법은 리소스로 PNG를 저장하고 런타임에 clBtnFace로 채워진 버튼 크기의 비트 맵에 페인트하는 것입니다 . 그런 다음 비트 맵이 컨트롤의 글리프로 사용되었습니다.

알파 마스크가있는 아이콘을 지원하는 델파이는 매우 제한적이지만 훌륭한 아이콘 라이브러리 kicon이 도움이 될 수 있습니다.

function AddIconFromResource(ImageList: TImageList; ResID: Integer): Integer; 
var 
    Icon: TIcon; 
begin 
    Icon := TIcon.Create; 
    try 
    Icon.LoadFromResourceID(HInstance, ResID); 
    Result := ImageList.AddIcon(Icon); 
    finally 
    Icon.Free; 
    end; 
end; 

function AddPngFromResource(ImageList: TImageList; ResID: Integer): Integer; 
var 
    Png: TPngGraphic; 
    ResStream: TStream; 
    Bitmap: TBitmap; 
begin 
    ResStream := nil; 
    Png := nil; 
    Bitmap := nil; 
    try 
    ResStream := TResourceStream.CreateFromID(HInstance, ResID, RT_RCDATA); 
    Png := TPNGGraphic.Create; 
    Png.LoadFromStream(ResStream); 
    FreeAndNil(ResStream); 
    Bitmap := TBitmap.Create; 
    Bitmap.Assign(Png); 
    FreeAndNil(Png); 
    Result := ImageList.Add(Bitmap, nil);    
    finally 
    Bitmap.Free; 
    ResStream.Free; 
    Png.Free; 
    end; 
end; 

// this could be e.g. in the form's or datamodule's OnCreate event 
begin 
    // create the imagelist 
    ImageList := TImageList.Create(Self); 
    ImageList.Name := 'ImageList'; 
    ImageList.DrawingStyle := dsTransparent; 
    ImageList.Handle := ImageList_Create(ImageList.Width, ImageList.Height, ILC_COLOR32 or ILC_MASK, 0, ImageList.AllocBy); 
    // populate the imagelist with png images from resources 
    AddPngFromResource(ImageList, ...); 
    // or icons 
    AddIconFromResource(ImageList, ...); 

end; 
6

는 알파 투명도를 지원하려면 이미지 목록을 작성하고 런타임에 그것을 채울 필요가? 알파 블렌딩을 의미합니까? 델파이 7의 TImageList는 전혀 지원하지 않습니다. 그게 니가 무슨 뜻인지 확신 할 수 있니? 어쩌면 일부 스크린 샷일까요?
+0

안녕하세요, 어떤 델파이 버전을 사용하고 있습니까? 나는 델파이 7 있고 TIcon 아무 기능 "LoadFromResourceID"... 그리고 당신은 ImageList_Create 함수 showme 수 있습니까? Btw. 어떤 리소스 편집기를 사용합니까? thx;) – ben

+1

코드는 Delphi 2007 용입니다. TIcon.LoadFromResourceID는이 작업을 수행합니다 : 아이콘.핸들 : = LoadIcon (인스턴스, MakeIntResource (ResID)); ImageList_Create는 CommCtrl 단위로 선언 된 Windows API (일반 컨트롤, comctl32.dll)입니다. 리소스 편집기의 경우 때때로 델파이 데모에서 resxplor를 사용합니다. :-) –

+0

+1. 좋은! 불행히도 (나를 위해) 이것은 XP 매니페스트를 포함하는 경우에만 작동합니다. 아직 매니페스트를 포함하지 않고도 해결책을 찾고 있습니다. – kobik