TDBGrid があり、行全体が選択されていて、フォーカスされていなくても常に選択を表示し、それを完全に所有者描画したい場合は、非推奨の eventOnDrawDataCell
と新しい eventの選択肢がありますDrawColumnCell
。私は後者を選択して試しましたこれ:
procedure TDbGridTestForm.mygridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if gdSelected in State then begin
// mygrid.DrawCellHighlight(Rect, State, Col, Row);
mygrid.Canvas.Brush.Color := clHighlight;
mygrid.Canvas.Font.Color := clHighlightText;
mygrid.Canvas.FillRect(Rect);
end;
mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
そして、私を夢中にさせているのは、フォーカスの表示 (ハイライトの色とフォーカスの四角形) が DefaultDrawColumnCell コードによって描画されないことです。
DefaultDrawing をオンにすると、一連の不具合 (奇妙なフォント ペイントの問題) が発生し、オフにすると、別の一連の不具合が発生します (gdSelected の場合でも強調表示されません)。
DBGrids.pas のコードはDefaultDrawColumnCell
、テキストを描画するだけです。明らかに、すべての描画コードを自分で引き継ぐ場合は、さらに多くのことを行う必要があります。ただし、DBGrids.pas が依存する Grids.pas に組み込まれたハイライト描画コードは、このコンテキストから呼び出されるようには設計されていません。直接呼び出しDrawCellHighlight
て (上記のコメントアウトを参照)、Col と Row の値を計算する必要があるのか、それともさまざまなケースをすべて手動で処理する TCustomGrid.DrawCellHighlight の独自の複雑なバージョンを作成する必要があるのか、わかりません。
確かにこれは非常に単純で明白ですが、私はそれを見落としています。DefaultDrawing をオフにしておく必要があるため、所有者の描画イベント内から完全にペイントする必要があることに注意してください。また、テーマ サービスが利用できない場合でも実行できる必要があり、利用可能な場合はテーマ サービスを使用する必要があります。そのため、TCustomGrid.DrawCellHighlight を直接呼び出す必要があります (方法がわかりません)。または、完全に再実装する必要があります。