Zum Inhalt springen

Objekt verschwindet beim erneuten Zeichnen


aLeXanDer..

Empfohlene Beiträge

Hallo Community

Ich habe folgendes Problem:

Ich habe ein Objekt erstellt, dass von einem TImage abgeleitet ist.

Es soll so eine Art Balkenanzeige darstellen, mit festlegen von Min und MaxWert und aktuellem Progress.

Nun hab ich 8 solcher Objekte auf meiner Form und ab und an passiert es, dass ein Objekt aufeinmal verschwindet und da wo es gestanden hat eine Lücke klafft...

Das kanne muss im Zeichnen passieren, hab da auch schon angehalten aber er läuft normal durch, dennoch keine anzeige.

Tritt auch nur manchmal auf.Sehr komisch.

Manchmal bleibt das Objekt da , aber der Text im Objekt erscheint nicht mehr.



void __fastcall TBalken::Zeichnen()

{

  int  FillSize;

  int  W, H;




  std::auto_ptr<TBalkenBitmap> OverlayImage(new TBalkenBitmap());



  TRect PaintRect;


  PaintRect = ClientRect;



  PaintBackground(this->Picture->Bitmap);


  InflateRect(&PaintRect, -1, -1);


  OverlayImage->MakeLike(this->Picture->Bitmap);

  PaintBackground(OverlayImage.get());




  W = PaintRect.Right - PaintRect.Left + 1;

  H = PaintRect.Bottom - PaintRect.Top + 1;


  Canvas->Brush->Color = FHinterGrundFarbe;

  Canvas->FillRect(PaintRect);

  Canvas->Pen->Color = clBlack;

  Canvas->Pen->Width = 1;

  Canvas->Brush->Color = FBalkenFarbe;


  FillSize = SolveForX(PercentDone, H);

  if (FillSize >= H)

	FillSize = H - 1;


  NegativenMinPruefen();


  if (FNegativAnz)

  {

	Canvas->FillRect(Rect(PaintRect.Left,H - FillSize,W, H/2));

	FNegativAnz = false;

  }

  else

	Canvas->FillRect(Rect(PaintRect.Left,H - FillSize,W, H));



  Canvas->CopyMode = cmSrcInvert;

  Canvas->Draw(0, 0, OverlayImage.get());

  Canvas->CopyMode = cmSrcCopy;

  PaintAsText(this->Picture->Bitmap, PaintRect);

  Canvas->CopyMode = cmSrcCopy;

  Canvas->Draw(0, 0, this->Picture->Bitmap);


}

//------------------------------------------------------------------------------


//------------------------------------------------------------------------------

void __fastcall TBalken::PaintAsText(Graphics::TBitmap* AnImage, const TRect& PaintRect)

{

  AnsiString S , E;

  int X, Y;

  std::auto_ptr<TBalkenBitmap> OverRect(new TBalkenBitmap);


  OverRect->MakeLike(AnImage);

  PaintBackground(OverRect.get());


  if (FProzentAnz == true)

  {

	S = AnsiString((int)PercentDone);

	E += "%";

  }

  else

  {

	S = FCurValue;

	E = FEinheit;

  }


  OverRect->Canvas->Brush->Style = bsClear;

  OverRect->Canvas->Font = Font;

  OverRect->Canvas->Font->Color = clWhite;


  if (E.Length())

  {

	X = (PaintRect.Right - PaintRect.Left + 1 - OverRect->Canvas->TextWidth(S)) / 2;

	Y = (((PaintRect.Bottom - PaintRect.Top + 1) /2) - OverRect->Canvas->TextHeight(S));

	OverRect->Canvas->TextRect(PaintRect, X, Y, S);

	X = (PaintRect.Right - PaintRect.Left + 1 - OverRect->Canvas->TextWidth(E)) / 2;

	Y = ((PaintRect.Bottom - PaintRect.Top + 1) / 2) ;

	OverRect->Canvas->TextRect(PaintRect, X, Y, E);

  }

  else

  {

	X = (PaintRect.Right - PaintRect.Left + 1 - OverRect->Canvas->TextWidth(S)) / 2;

	Y = (PaintRect.Bottom - PaintRect.Top + 1 - OverRect->Canvas->TextHeight(S)) / 2;

	OverRect->Canvas->TextRect(PaintRect, X, Y, S);

  }

  AnImage->Canvas->CopyMode = cmSrcInvert;

  AnImage->Canvas->Draw(0, 0, OverRect.get());

}

//------------------------------------------------------------------------------

void __fastcall TBalken::PaintBackground(Graphics::TBitmap* AnImage)

{

  TRect  ARect;

  AnImage->Canvas->CopyMode = cmBlackness;

  ARect = Rect(0, 0, Width, Height);

  AnImage->Canvas->CopyRect(ARect, AnImage->Canvas, ARect);

  AnImage->Canvas->CopyMode = cmSrcCopy;

}

//------------------------------------------------------------------------------

//------------------------------------------------------------------------------

/* TBalkenBitmap */

__fastcall BalkenBitmap::BalkenBitmap(): Graphics::TBitmap(){}

//------------------------------------------------------------------------------

void __fastcall BalkenBitmap::MakeLike(Graphics::TBitmap* ATemplate)

{

  Width = ATemplate->Width;

  Height = ATemplate->Height;

  Canvas->Brush->Color = TColor(clWindowFrame);

  Canvas->Brush->Style = bsSolid;

  Canvas->FillRect(Rect(0, 0, Width, Height));

}

//------------------------------------------------------------------------------


Danke

Alex

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ohne jetzt mich komplett in den Code eingelesen zu haben, kann es sein, dass Du auch die Methode "repaint" passend implementieren musst?

Denn (und das ist wirklich lange her) musste ich bei einem TImage auch die repaint Methode passend implementieren, die bei der Fensterveränderung usw aufgerufen wird

HTH Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...