2012-05-10 58 views
6

Tôi đang sử dụng VT.Background để hiển thị hình nền trong VT với một vài cột.
Nhưng tôi không thể tìm cách sử dụng các màu khác nhau cho các ô vì chúng ẩn hình nền.Làm thế nào để tô màu các ô trộn với ảnh nền trong VirtualTreeView?

Tôi đã cố gắng sử dụng OnBeforeItemErase nhưng nếu tôi sử dụng EraseAction := eaColor khu vực bitmap nền trên ô cũng đang được vẽ, nếu tôi sử dụng eaDefault thì màu không được áp dụng.

Bất kỳ ý tưởng nào về cách thực hiện điều này?

+2

Phần nào của tế bào nào bạn muốn chứa các màu sắc khác nhau? Ý bạn là màu * text *? Bạn có nghĩa là nền, nhưng chỉ có một phần chiếm đóng bởi văn bản? Vui lòng chỉnh sửa câu hỏi cụ thể hơn. –

+2

Bạn có sử dụng màu nền khác trong một số ô nhưng vẫn pha trộn với hình nền không? –

Trả lời

18

Chỉ cần một nỗ lực để đoán nếu đó là những gì bạn đang tìm kiếm:

Cập nhật:
Added một chức năng màu hoà trộn cho máy CPU không 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; 

Xem trước đoạn code trên:

enter image description here

+7

Điều này có vẻ tuyệt vời ... –

+3

@Leonardo, cảm ơn! Tôi vừa thêm một chức năng pha trộn màu cho các máy CPU không MMX (hy vọng đó là cách đúng và dễ nhất), nhưng nó vẫn chỉ là một phỏng đoán những gì đang được hỏi ở đây ;-) – TLama

+3

Điều này hoạt động giống như một sự quyến rũ! rực rỡ! 10x – ZigiZ

Các vấn đề liên quan