Własny komponent i TCanvas

0

Witam. Robię własny komponent a'la TrackBar, ale jako "podstawę" wybrałem TCustomControl.
Część za którą się "łapie" myszką jest oczywiście na Canvasie namalowana. Ta część jest w formie pięciokąta, tak jakby kwadrat z trójkątem. I z częścią koło trójkąta jest problem.
Pierwsze namalowanie tej części przebiega poprawnie, ale gdy zmieniam szerokość tego elementu to oprócz nowo namalowanego elementu pozostaje stary. Wprawdzie nowo namalowany element jest nad nim, ale część starego widać.
Szukałem w internecie wiele na temat czyszczenia Canvasu.
Niestety tego, co głównie jest doradzane, czyli namalowania prostokąta i na nim malowanie znowu jest u mnie niemożliwe, bo gdybym to zrobił, to Canvas stałby się prostokątem, a nawet gdybym namalował na nim ten pięciokąt to widać by było wystające dwa elementy koło części "trójkątnej".
Mam nadzieję, że dobrze opisałem mój problem, choć wygląda to zagmatwanie.

0

Niewiem czy już probowałeś z

Canvas.FillRect(0)

i później Canvas.Refresh


gdybyś pokazał kod to na pewno można by coś więcej wykombinować  ;-)
0

Próbowałem. To nie pomaga.
Oto część kodu odpowiadająca za malowanie tego elementu:

          FThumbBmp.Width  := FThumbWidth;
          FThumbBmp.Height := FThumbHeight;
          FThumbBmp.Canvas.Brush.Style := bsSolid;
          FThumbBmp.Canvas.Brush.Color := FThumbColor;
          FThumbBmp.Canvas.Pen.Color   := FThumbBorderColor;
          FThumbBmp.Canvas.Pen.Width   := 1;
//...
// W kodzie poniżej wysokość TRÓJKĄTA to 2x szerokość elementu (dlatego FThumbWidth div 2)
          FThumbBmp.Canvas.MoveTo(0,0);
                  FThumbBmp.Canvas.LineTo(FThumbWidth,0);
                  FThumbBmp.Canvas.MoveTo(0,0);
                  FThumbBmp.Canvas.LineTo(0, FThumbHeight - (FThumbWidth div 2));
                  FThumbBmp.Canvas.MoveTo(FThumbWidth -1,0);
                  FThumbBmp.Canvas.LineTo(FThumbWidth -1, FThumbHeight - (FThumbWidth div 2));
                  FThumbBmp.Canvas.MoveTo(0, FThumbHeight - (FThumbWidth div 2));
                  FThumbBmp.Canvas.LineTo(FThumbWidth div 2, FThumbHeight);
                  FThumbBmp.Canvas.MoveTo(FThumbWidth -1, FThumbHeight - (FThumbWidth div 2));
                  FThumbBmp.Canvas.LineTo(FThumbWidth div 2, FThumbHeight);

                  FThumbBmp.Canvas.Brush.Style := bsSolid;
                  FThumbBmp.Canvas.Pen.Color   := FThumbColor;
                  FThumbBmp.Canvas.FillRect(Rect(1, 1, FThumbWidth -1, FThumbHeight - (FThumbWidth div 2) -1));
                  Int := 0;
                  FThumbBmp.Canvas.MoveTo(1, FThumbHeight - (FThumbWidth div 2) -1);
                  FThumbBmp.Canvas.LineTo(FThumbWidth -1, FThumbHeight - (FThumbWidth div 2) -1);
                  for I:= FThumbHeight - (FThumbWidth div 2) to FThumbHeight do
                  begin
                    FThumbBmp.Canvas.MoveTo(1 + Int, I);
                    FThumbBmp.Canvas.LineTo(FThumbWidth -1 - Int, I);
                    Int := Int +1;
                  end;
// ...
FThumbHeight	:=	FThumbBmp.Height;
FThumbWidth     :=	FThumbBmp.Width;
//...

  FBackgroundBmp.Width	:=	FThumbBmp.Width;
  FBackgroundBmp.Height	:=	FThumbBmp.Height;
  FBackgroundBmp.Canvas.CopyRect(Rect(0,0, FThumbBmp.Width, FThumbBmp.Height), Canvas, FThumbRect);
//...
	WorkBmp := TBitmap.Create;
        try
  	WorkBmp.Height	:=	FThumbBmp.Height;
  	WorkBmp.Width	:=	FThumbBmp.Width;

	WorkRect			     :=	     Rect(0, 0, FThumbBmp.Width, FThumbBmp.Height);
    	WorkBmp.Canvas.CopyMode	:=	cmSrcCopy;
        WorkBmp.Canvas.CopyRect(WorkRect,FBackgroundBmp.Canvas,WorkRect);
        WorkBmp.Canvas.CopyMode	:=	cmSrcAnd;
        WorkBmp.Canvas.CopyRect(WorkRect,FThumbBmp.Canvas,WorkRect);

        Canvas.CopyRect(FThumbRect,WorkBmp.Canvas,WorkRect);
0

Po 8 godzinach spędzonych nad tą jedną drobnostką w końcu mi wyszło :D
Otóż robię to tak:
Nie maluję środka kwadratowej części tego elementu za pomocą FillRect i nie używam Brush'a, bo za drugim malowaniem Brush wypełnia CAŁY Canvas, a nie tylko część z FillRect!
Więc zamiast FillRect robię to rysując linie - efekt jest ten sam, tylko 5 linijek kodu więcej.
Gdy zmieniam szerokość/wysokość tego elementu najpierw ustawiam oba te parametry na 0 i maluję element, co powoduje jakby wyzerowanie Canvasu w moim przypadku, a potem to już normalnie :)

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