Canvas->KannWas Rechteck lässt sich nicht mit TransparentColor überzeichnen
-
Hi,
schonwieder ein KannWas-Prob. Ich zeichne mom. auf einer Paintbox mit Canvas rum. Wenn ich neu zeichnen will, dann lösche ich, indem ich ein großes Rechteck mit clMaroon(meiner Transparenz-Farbe) fülle.
Funzt alles Supi, aber ein Dreieck macht mich wahnsinnig.
Eig, sollte es bei !blCanGoUp nicht angezeigt werden(Was es am Anfang auch nicht macht). Sobald es aber einmal gezeichnet wurde((blCanGoUp) Erst ein Rechteck mit Silber und da dann obendrauf das Dreieck), verschwindet weder das Rechteck noch das Dreieck.
Spaßeshalber habe ich mal mit grün(im else Teil) drüber gezeichnet, das funzt supi. Wenn ich dann aber das grün mit clMaroon vertausche, bleiben das Rechteck und das Dreieck stehen). Aus Canvas-Sicht logisch, nützt es auch nichts erst mit grün zu zeichnen und dann mit clMaroon drüber zu zeichnen. Gleicher Effekt, das Rechteck (mit Dreieck) bleibt stehen.
if (blCanGoUp) { RecTri.Top=iTop; RecTri.Bottom=RecTri.Top+iTriangleSize+iTrianglePad; pBitmap->Canvas->Brush->Color=clSilver; pBitmap->Canvas->FillRect(RecTri); Pts[0]=Point(RecTri.Left+iMid-iTriangleSize,RecTri.Bottom-iTrianglePad); Pts[1]=Point(RecTri.Left+iMid+iTriangleSize,RecTri.Bottom-iTrianglePad); Pts[2]=Point(RecTri.Left+iMid,RecTri.Top+iTrianglePad); pBitmap->Canvas->Brush->Color=(TColor)0x00FBD2AA; pBitmap->Canvas->Polygon(Pts,2); }else{ RecTri.Top=iTop; RecTri.Bottom=RecTri.Top+iTriangleSize+iTrianglePad; pBitmap->Canvas->Brush->Color=clGreen; pBitmap->Canvas->FillRect(RecTri); }
Hoffe da kann mir einer raushelfen!
lg
-
Schon mal die Methode
TCanvas::Polygon
ausprobiert?
-
ja, selbes Prob!
Es würde ja schon helfen, wenn ich das gesamte Rechteck löschen könnte.
-
Hallo,
wenn du schon die PaintBox nutzt, dann zeichne einfach im OnPaint-Event.
Ein Invalidate() Aufruf führt dann dieses Event wieder neu aus (und löscht vorher den gesamten Inhalt).
-
okay, bin dem prob jetzt näher gekommen. Wenn die gesamte Paintbox neu gezeichnet wird, funzt es.
was ich bisher noch nicht verraten hatte:
ich habe 3 Klassen. TCursorSelect ist die FormKlasse. Um darin die anderen Klassen zu verstecken, hab ich darin die Klasse Navi und Lst verschachelt.
Hier mal der Ablauf:
Bitmap löschen.(mit aktueller Größe)
Navi und Lst berechnen Ihre Größe(hier würde ich gerne die Berechnung und das zeichnen zusammenlegen, habe aber noch keine Lösung, wie ich auf nicht sichtbaren Canvas zeichnen kann. Eine Lösung wäre nice) und setzten dann ihre Größe in der Bitmap und der Paintbox.
Jetzt zeichnet zuerst Navi auf die Bitmap, und dann Lst.und zum Schluß:
paBox->Canvas->Draw(0,0,pBitmap);
Da Navi sozusagen statisch ist, und nicht neu gezeichnet werden muss, übergebe ich Lst einen Zeiger auf die PaintBox, und zeichne lediglich die Bereiche die sich ändern neu und rufe dann auf:
pBx->Canvas->Draw(0,0,pBitmap);
wobei jetzt Lst::pBx der identische Zeiger wie TCursorSelect::paBox ist, und Lst::pBitmap ebenfalls eine Kopie von TCursorSelect::pBitmap
das funzt auch supi, solange Bereiche überzeichnet werden.
Aber bei der transparenten Farbe funzt das iwie nicht.
Wenn ich aber jetzt wie th69 geschrieben hat(thx übrigens) invalidate aufrufe, lande ich in einer endlosschleife, da ja paint die gesamte draw-routine aufruft, und die dann wieder lst->draw, die dann wieder invalidate aufruft.
iwie bin ich mit meinem "Erfahrungsschatz" in ner Sackgasse gelandet, und finde nimmer raus!
lg
-
Ja, wenn ich ne bool setzte blMustDraw und dann invalidate aufrufe funzt es.
Ich finde aber daß das net die optimale Lösung ist. Hat jmd ne bessere?
lg