2011-07-04 5 views
5

まあ、私は次の問題があります:VirtualStringTree CellPaint

いくつかのブール値に応じて色分けしてツリーセルを塗りました。 例:

  • isProcessService、
  • isProcessInDebugger、
  • isProcessService、
  • isProcessElevated、
  • isProcessNet、
  • isProcessOwner、
  • isProcessinJob、
  • isProcessPacked、
  • isProcessMarkedForDeletion、
  • isProcessMarkedForCreation:ブール;

だからBeforeCellPaintに私のようなものをブール値に基づいてセルの背景色をペイントします:

 
procedure TMainForm.ProcessVstBeforeCellPaint(Sender: TBaseVirtualTree; 
    TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; 
    CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); 
var 
    NodeData: PProcessData; 
begin 
if Node = nil then 
    Exit; 

    NodeData := Sender.GetNodeData(Node); 

    if NodeData = nil then 
    Exit; 

    if (NodeData^.isProcessOwner) then 
    begin 
    TargetCanvas.Brush.Color := $00AAFFFF; 
    TargetCanvas.FillRect(TargetCanvas.ClipRect); 
    end; 

    if (NodeData^.isProcessInDebugger) then 
    begin 
    TargetCanvas.Brush.Color := $00E5A5A5; 
    TargetCanvas.FillRect(TargetCanvas.ClipRect); 
    end; 

    if (NodeData^.pProcessID = 0) or (NodeData^.pProcessID = 4) then 
    begin 
    TargetCanvas.Brush.Color := $00FFCCAA; 
    TargetCanvas.FillRect(TargetCanvas.ClipRect); 
    end; 

    if (NodeData^.isProcessElevated) and not(NodeData^.isProcessInDebugger) then 
    begin 
    TargetCanvas.Brush.Color := $0000AAFF; 
    TargetCanvas.FillRect(TargetCanvas.ClipRect); 
    end; 

    if (NodeData^isProcessService) and 
    not (NodeData^.isProcessPacked) and 
    not(NodeData^.isProcessNet) then 
    begin 
    TargetCanvas.Brush.Color := $00FFFFCC; 
    TargetCanvas.FillRect(TargetCanvas.ClipRect); 
    end; 

    if (NodeData^.isProcessMarkedForDeletion) then 
    begin 
    TargetCanvas.Brush.Color := $005D5DFF; 
    TargetCanvas.FillRect(TargetCanvas.ClipRect); 
    end; 

    if (NodeData^.isProcessMarkedForCreation) then 
    begin 
    TargetCanvas.Brush.Color := $0061E15E; 
    TargetCanvas.FillRect(TargetCanvas.ClipRect); 
    end; 

    if (NodeData^.isProcessNet) then 
    begin 
    TargetCanvas.Brush.Color := $005CE0BF; 
    TargetCanvas.FillRect(TargetCanvas.ClipRect); 
    end; 
end; 


質問です:私は緑または赤応じてセルをペイントできるか

プロセスが作成または削除される(色を少なくとも1秒間維持した後、元の値に戻す)

I other wプロセスが作成されます。緑色のセルをペイントしてから、isProcessService、ProcessOwnerなどに応じて元の色に切り替えます。

最大の問題は、非ブロッキングモード(私はそうでなければ睡眠を使うことができないので、木も凍りつくので色の変化は気づかれません)

私に従うことができない場合、私は同じプロセスを模倣しようとしていますProcess ExplorerまたはProcess Hackerはプロセスが作成または削除されます。どちらのアプリケーションも、赤や緑のプロセスのセルの背景を1秒間ペイントしてから、元の色に戻します。

ちょうど情報のために、私はプロセスの作成または削除をwmi経由で通知します。

+0

'TargetCanvas.ClipRect'ではなく、' CellRect'を使用してください。 –

+0

あなたはどのように処理リストの変更を扱いますか、ツリーを常に再構築していますか、必要に応じてノードを追加/削除しますか?ところで、VTのセルの背景色を設定する正しい方法は、 'BeforeCellPaint'ではなく' BeforeItemErase'イベント( 'EraseAction:= eaColor')を使うことです。 – ain

+0

あなたはライトを混乱させているよ – stOrM

答えて

5

プロセスが作成されるたびに、そのプロセスに関連付けられたタイマーをタイムアウト値1秒で開始します。 isProcessMarkedForCreationはtrueに設定されているため、行は緑色に塗られています。タイマーが起動すると、ハンドラはisProcessMarkedForCreationをfalseに設定し、緑のハイライトを削除する行の再描画を強制します。タイマーは作業を終えたので、削除する必要があります。まったく同じアプローチを削除に使用できます。

+0

はい、完璧なことがある場合もあります。 – stOrM