2012-05-10 8 views
6

Estoy usando VT.Background para mostrar una imagen de fondo en VT con algunas columnas.
Pero no puedo encontrar la manera de usar diferentes colores para las celdas porque ocultan la imagen de fondo.Cómo colorear las celdas de mezcla con una imagen de fondo en VirtualTreeView?

He intentado usar OnBeforeItemErase pero si uso EraseAction := eaColor el área de mapa de bits de fondo en la celda también se está pintando, si uso eaDefault, el color no se está aplicando.

¿Alguna idea de cómo se puede hacer esto?

+2

¿Qué parte de la célula hacer que desea que contenga el color diferente? ¿Te refieres al color * text *? ¿Te refieres al fondo, pero solo a la parte ocupada por el texto? Por favor, edite la pregunta para ser más específico. –

+2

¿Quiere decir que utiliza un color de fondo diferente en algunas celdas pero aún se mezcla con la imagen de fondo? –

Respuesta

18

sólo un intento de adivinar si eso es lo que busca:

Actualización:
ha añadido una función de mezcla de colores para máquinas de CPU no 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; 

de vista previa del código anterior:

enter image description here

+7

Esto se ve muy bien ... –

+3

@Leonardo, gracias! Acabo de agregar una función de combinación de colores para las máquinas que no son de la MMX (espero que sea la correcta y la más fácil), pero todavía es solo una suposición lo que se pregunta aquí ;-) – TLama

+3

¡Esto funciona como un encanto! ¡brillante! 10x – ZigiZ

Cuestiones relacionadas