Как правильно отрисовать владельцем TDBGrid с полной строкой, когда TDBGrid.DefaultDrawing имеет значение false?

Когда у вас есть TDBGrid, полный выбор строки и всегда показывать выделение, даже если он не сфокусирован, и вы хотите, чтобы полностью нарисованный владельцем, у вас есть выбор из устаревшего события OnDrawDataCell и нового события 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, и я уверен, что мне следует вызывать DrawCellHighlight вместо того, чтобы выполнять хак FillRect, который я делаю выше.

Если я включаю DefaultDrawing, я получаю один набор сбоев (проблемы с рисованием нечетных шрифтов), а если я его выключаю, я получаю еще один набор сбоев (без выделения, даже когда gdSelected).

Код в DBGrids.pas DefaultDrawColumnCell не делает ничего, кроме рисования текста. Итак, ясно, что вы должны сделать больше, если возьмете на себя весь код рисования. Однако встроенный в Grids.pas код отрисовки подсветки, от которого зависит DBGrids.pas, не предназначен для вызова из этого контекста. Я не могу понять, следует ли мне напрямую вызывать DrawCellHighlight (показано закомментировано выше) и вычислять значения Col и Row, или я должен писать свою собственную сложную версию TCustomGrid.DrawCellHighlight, который обрабатывает все различные случаи вручную.

Конечно, это так просто и очевидно, и я просто не замечаю этого. Обратите внимание, что я должен оставить DefaultDrawing выключенным, и поэтому я должен полностью рисовать изнутри моего события рисования владельца, и что я должен иметь возможность запускать, когда службы тем недоступны, и я должен использовать службы тем, когда они доступны. Поэтому мне нужно вызвать TCustomGrid.DrawCellHighlight напрямую (и я не знаю, как это сделать), или мне нужно полностью его реализовать.

6
задан Warren P 27 February 2012 в 16:53
поделиться