2014-04-07 1 views
0

현재 TdsTaskBar라는 구성 요소로 작업 중이며, 이는 창에서 TaskBar처럼 작동합니다. 즉, 열려있는 모든 창 (이제는 내 애플리케이션 내부)이 내 애플리케이션의 아래쪽에 버튼으로 나열된다는 것을 의미합니다. -창문. 이 버튼은 TSpeedButtons입니다. 이제 윈도우의 아이콘을 변경했습니다.이 아이콘은 항상 SpeedButton의 글리프를 통해 표시됩니다. 문제는 투명성이 작동하지 않는다는 것입니다.Delphi TSpeedButton Glyph 투명도

왼쪽 하단 모서리 픽셀로 정의 된 투명 색을 알고 있지만 내 문제는 아닙니다. 문제는 활성 창을 변경 한 다음 버튼 위로 마우스를 가져갈 때 글리프의 투명한 영역에 버튼 배경 대신 "임의"이미지 아티팩트가 표시된다는 것입니다. 그러면 배경이 현재 활성 창의 아이콘으로 변경되지만 약간의 왜곡이 있습니다. Second window opened, hovered over the button

First window opened 나는이 유물이 얼마나 단서가 없다,하지만 난 모든 페인트 관련 절차를 점검 때문에, 그것은 TdsTaskBar-/TdsTaskButton-구성 요소에서 오지 않는다는 것을 확신 .

누군가이 문제를 해결하는 방법에 대해 알고 있습니까? 배경을 직접 그리는 방법에 대해서는 이미 생각해 봤지만이 글리프 뒤에있는 실제 버튼 색을 알아야 할 필요가 있습니다. 그 점을 파악하는 방법에 대해 잘 모르겠습니다. 여기


글리프를 할당하는 코드

는 도면 표준 VCL SpeedButton 코드에 의해 처리됩니다

procedure TTaskBarButton.AssignGlyphIcon; 
var 
    GlyphIcon: TIcon; 
    b: TBitmap; 
begin 
    if TForm(owner).Icon.Empty then 
    GlyphIcon := Application.Icon 
    else 
    GlyphIcon := TForm(owner).Icon; 

    b := TBitmap.create; 
    try 
    b.Width := GlyphIcon.Width; 
    b.Height := GlyphIcon.Height; 
    b.Canvas.Brush.Color := b.TransparentColor; // This two lines were added by me 
    b.Canvas.FillRect(b.ClipRect);   // so that the background of my "helper" bitmap is transparent, too 
    b.Canvas.Draw(0,0, GlyphIcon); 
    Glyph.Width := 16; 
    Glyph.Height := 16; 
    Glyph.Canvas.StretchDraw(Rect(0, 0, 16, 16), b); 
    finally 
    b.free; 
    end; 
end; 
+0

[디자이너] (http://www.pretty-software.com/)에게 나에게 구성 요소의 결함이있는 것 같습니까? – whosrdaddy

+0

필자는 구성 요소의 전체 소스를 가지고 있으며 그다지 코드가 아니며 하나의 짧은 단위입니다. 글리프 그리기는 간단하고 간단합니다. 오류가 그곳에 있지 않다는 것이 확실합니다. 질문을 편집하고 Glyph 도면의 코드를 추가하겠습니다. –

+0

'글리프 (Glyph)'배경을 지울 수 없습니다. 나는 또한 당신이 왜'b'가 필요한지 정말로 이해하지 못합니다. 마지막으로 알파 투명도가 적용된 이미지를 사용하고있는 것처럼 보입니다. 그렇다면 왜 'TransparentColor'를 사용해야합니까? –

답변

0

을해야하는 샘플 코드 경우 : TdsTaskBar는 (그것이 TCustomPanel의) false로 기본 설정을 DoubleBuffered있다. 단추는이 설정을 상속합니다. 이것을 true로 변경하면 문제가 해결됩니다.

그래서 DoubleBuffering은 버튼의 투명도 기능에 영향을 미칩니다.

+1

이것은 SSCCE를 만들어야하는 이유를 보여주는 완벽한 데모입니다! –

+0

예, 당신 말이 맞아요. 나는 다음에 시간을 내서 무언가를 익히고 SSCCE를 만드려는 생각을 할 것입니다. –

+0

SSCCE를 만드는 시간의 90 %가 이렇게하면 문제의 원인이 될 수 있습니다. 윈 - 윈! –

2

당신은 문양의 배경을 삭제해야합니다. 여기

솔루션을 찾을 작업

procedure TTaskBarButton.AssignGlyphIcon; 
var 
    b: TBitmap; 
    r: TRect; 
begin 
    b := TBitmap.create; 
    try 
    if TForm(Owner).Icon.Empty then 
     b.Assign(Application.Icon) 
    else 
     b.Assign(TForm(Owner).Icon); 

    r := TRect.Create(0, 0, 16, 16); 
    Glyph.Width := r.Width; 
    Glyph.Height := r.Height; 
    // clear the background 
    Glyph.Canvas.Brush.Color := Glyph.TransparentColor; 
    Glyph.Canvas.FillRect(r); 
    // draw the icon 
    Glyph.Canvas.StretchDraw(r, b); 
    finally 
    b.free; 
    end; 
end; 
+0

미안하지만, 문제가 해결되지 않았습니다. 원래의 것보다 분명히 구현이 분명하지만 질문 : –

+0

에 설명 된 것과 동일한 효과가 있습니다. D –

+0

구성 요소를 설치하지 않았지만 일반 SpeedButton을 사용하여 페인트 할 수 있습니다. 문양에 부작용이없는 아이콘 –