2012-05-10 25 views
6

VT'de arka plan görüntüsünü birkaç sütun ile görüntülemek için VT.Background kullanıyorum.
Ancak, arka plan resmini gizledikleri için hücreler için farklı renkler kullanmanın bir yolunu bulamıyorum.VirtualTreeView'de arka plan görüntüsü olan hücreleri nasıl karıştırılır?

Ben OnBeforeItemErase kullanmayı denedi ama EraseAction := eaColor kullanırsam renk uygulanmıyor eaDefault kullanırsanız hücre üzerinde arka plan bitmap alanı da, boyanıyor.

Bunun nasıl yapılabileceği hakkında bir fikriniz var mı? Bu Aradığınız buysa tahmin etmeye

+2

Eğer farklı bir renk ihtiva etmesini istememektedir hücrenin Hangi parçası? * Metin * rengini mi kastediyorsunuz? Arka plandan mı bahsediyorsun, sadece metnin kapladığı kısım mı? Lütfen daha spesifik olmak için soruyu düzenleyin. –

+2

Bazı hücrelerde farklı bir arka plan rengi kullanıp yine de arka plan görüntüsüne karşı harmanlamayı mı kastediyorsunuz? –

cevap

18

Sadece bir girişim:

Güncelleme:
Eklendi olmayan MMX işlemci makineleri için bir renk karıştırma fonksiyonu.

procedure ColorBlend(const ACanvas: HDC; const ARect: TRect; 
    const ABlendColor: TColor; const ABlendValue: Integer); 
var 
    DC: HDC; 
    Brush: HBRUSH; 
    Bitmap: HBITMAP; 
    BlendFunction: TBlendFunction; 
begin 
    DC := CreateCompatibleDC(ACanvas); 
    Bitmap := CreateCompatibleBitmap(ACanvas, ARect.Right - ARect.Left, 
    ARect.Bottom - ARect.Top); 
    Brush := CreateSolidBrush(ColorToRGB(ABlendColor)); 
    try 
    SelectObject(DC, Bitmap); 
    Windows.FillRect(DC, Rect(0, 0, ARect.Right - ARect.Left, 
     ARect.Bottom - ARect.Top), Brush); 
    BlendFunction.BlendOp := AC_SRC_OVER; 
    BlendFunction.BlendFlags := 0; 
    BlendFunction.AlphaFormat := 0; 
    BlendFunction.SourceConstantAlpha := ABlendValue; 
    Windows.AlphaBlend(ACanvas, ARect.Left, ARect.Top, 
     ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, DC, 0, 0, 
     ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, BlendFunction); 
    finally 
    DeleteObject(Brush); 
    DeleteObject(Bitmap); 
    DeleteDC(DC); 
    end; 
end; 

procedure TForm1.VirtualStringTree1BeforeCellPaint(Sender: TBaseVirtualTree; 
    TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; 
    CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); 
var 
    BlendColor: TColor; 
    BlendValue: Integer; 
begin 
    if CellPaintMode = cpmPaint then 
    begin 
    case Column of 
     0: BlendColor := $000080FF; 
     1: BlendColor := $0046C2FF; 
     2: BlendColor := $0046F5FF; 
    end; 
    BlendValue := 145; 
    if not VirtualTrees.MMXAvailable then 
     ColorBlend(TargetCanvas.Handle, CellRect, BlendColor, BlendValue) 
    else 
     VirtualTrees.Utils.AlphaBlend(0, TargetCanvas.Handle, CellRect, Point(0, 0), 
     bmConstantAlphaAndColor, BlendValue, ColorToRGB(BlendColor)); 
    end; 
end; 

Yukarıdaki kod Önizleme:

enter image description here

+7

Bu harika görünüyor ... –

+3

@Leonardo, teşekkürler! MMX olmayan CPU makineleri için bir renk karıştırma fonksiyonu ekledim (umarım doğru ve en kolay yoldur), ama yine de burada sorulmakta olan bir tahmin ;-) – TLama

+3

Bu bir çekicilik gibi çalışır! parlak! 10x – ZigiZ