StringGrid, DrawCell i Theme

0

Chcę dodać do stringgrida wskaźnik bieżącego wiersza jak w TDBGrid. Dodatkowo chcę aby wyświetlany symbol był zgodny z ustawionym stylem.
Okno bez znacznika wiersz wygląda tak:
screenshot-20210517101151.png

W TDBGrid podejrzałem, jak rysują obrazek i do zdarzenia DrawCell wstawiłem taki fragment kodu:

     if StyleServices.Enabled and not StyleServices.IsSystemStyle then
        StyleServices.DrawElement( Canvas.Handle,        
                   StyleServices.GetElementDetails(tgIndicatorArrow), System.Types.Rect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom));

Teraz okno wyświetla się tak:
screenshot-20210517101600.png

Do momentu wyświetlenia znacznika (w pierwszej kolumnie) komórki rysowane są poprawnie, po wyświetleniu znacznika rysowane są w kolorze białym.

Nie umiem sobie z tym poradzić. Może ktoś z Was potrafi mi podpowiedzieć jak rozwiązać ten problem lub wskaże kawałek kodu który działa podobnie.

Dziękuję za pomoc
Romek

1

Masz włączone skórki a te nadpisują kolory - czasem nawet te ustawiane z kodu. Jest to upierdliwe ale się da.
Na 100% musisz też sprawdzać czy komórka jest "selected" i rysować różnie w zależności od tego stanu.
Jeśli to nic nie da to napisz wtedy przegrzebię kod by zobaczyć jak dokładnie to wygląda.
screenshot-20210517115240.png

0

@katakrowa: Spodziewałem się, że funkcja rysująca element zmienia canvas. Szukałem gdzie się to odbywa ale nie udało mi się odnaleźć tego kawałka kodu. Zrobiłem więc tak:


        if Style.Enabled and not Style.IsSystemStyle then
        begin
           I := SaveDC(Canvas.Handle);
           try
              Style.DrawElement(Canvas.Handle,  Style.GetElementDetails(tgIndicatorArrow),  System.Types.Rect(Rect.Left+2, Rect.Top, Rect.Right, Rect.Bottom));
           finally
               RestoreDC(Canvas.Handle, I);
          end;
      end;

Teraz cały grid rysuje się poprawnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0