まあ、私は次の問題があります: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経由で通知します。
'TargetCanvas.ClipRect'ではなく、' CellRect'を使用してください。 –
あなたはどのように処理リストの変更を扱いますか、ツリーを常に再構築していますか、必要に応じてノードを追加/削除しますか?ところで、VTのセルの背景色を設定する正しい方法は、 'BeforeCellPaint'ではなく' BeforeItemErase'イベント( 'EraseAction:= eaColor')を使うことです。 – ain
あなたはライトを混乱させているよ – stOrM