2012-05-10 13 views
6

Sto utilizzando VT.Background per visualizzare un'immagine di sfondo in VT con poche colonne.
Ma non riesco a trovare un modo per utilizzare colori diversi per le celle perché nascondono l'immagine di sfondo.Come colorare le celle di fusione con un'immagine di sfondo in VirtualTreeView?

Ho provato ad utilizzare OnBeforeItemErase ma se uso EraseAction := eaColor zona bitmap di sfondo della cella viene anche dipinta, se uso eaDefault non viene applicato il colore.

Qualche idea su come questo può essere fatto?

+2

Quale parte della cellula che si desidera fare per contenere il colore diverso? Intendi il colore * del testo *? Intendi lo sfondo, ma solo della parte occupata dal testo? Si prega di modificare la domanda per essere più specifici. –

+2

Vuoi dire usare un colore di sfondo diverso in alcune celle ma mescolare ancora con l'immagine di sfondo? –

risposta

18

solo un tentativo di indovinare se è quello che state cercando:

Aggiornamento:
Aggiunta una funzione di colore di fusione per le macchine di CPU non MMX.

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; 

Anteprima del codice di cui sopra:

enter image description here

+7

Questo sembra fantastico ... –

+3

@ Leonardo, grazie! Ho appena aggiunto una funzione di miscelazione del colore per le macchine non MMX CPU (spero sia il modo giusto e più semplice), ma è solo una supposizione di ciò che viene chiesto qui ;-) – TLama

+3

Funziona come un incantesimo! brillante! 10x – ZigiZ