2 dringende Fragen zu Trackbar-Property und OnPaint beim Panel
-
Jochen Kalmbach schrieb:
Warum zeichnest Du nicht den gesamten Spielplan? Dann hast Du das Problem mit dem Transparent nicht mehr, oder?
Das hat andere Gründe die man in dem Codesnipsel nicht sehen kann das Programm ist etwas länger. Ich habe es jetzt geschafft und zwar zeichne ich eine Paralellogramm darein das Bild des Spielplans und durch den Panel des Spielsteins sieht man nur den Teil der unter dem Spielstein ist. Ist nicht wirklich transparenz reicht für meine Zwecke aber föllig und es flackert nicht.
Zwei Fragen wären aber noch offen:
- Wie schreibe ich aus C# in C++ CLI? Application::ApplicationExit += gcnew EventHandler( &TransparentPanel::MemoryCleanup );
- Wie kann ich die Farbe der Skala einer Trackbar festlegen, also gemeint sind die Striche an der Trackbar gerne auch der Nöpel den man mit der Maus clickt dazu. Das stellt sicher, dass die Skala jeder Benutzer sieht, egal welche Farbe er in seinem Windows eingestellt hat. Schwarz auf Schwarz sieht man nicht gut, auch wenn es nur die Skale und nicht der Slider selbst ist.
Vielen Dank für eure Vorschläge und Hilfe, diese Community ist klasse.
-
Frage 1:
Application::ApplicationExit += gcnew EventHandler( &TransparentPanel::MemoryCleanup );
Genau so wenn TransparentPanel::MemoryCleanup eine statische Methode ist. Wenn sie nicht-statisch ist musst Du als erstes Argument noch das Objekt angeben, auf welchem diese Methode aufgerufen werden soll.
ABER:
Was soll das? Was mach MemoryCleanup genau? Möchtest Du nicht viel eher das Disposable Pattern implementern, falls das überhaupt nötig ist? Was hast Du da überhaupt freizugeben???
-
theta schrieb:
Frage 1:
Application::ApplicationExit += gcnew EventHandler( &TransparentPanel::MemoryCleanup );
Genau so wenn TransparentPanel::MemoryCleanup eine statische Methode ist. Wenn sie nicht-statisch ist musst Du als erstes Argument noch das Objekt angeben, auf welchem diese Methode aufgerufen werden soll.
ABER:
Was soll das? Was mach MemoryCleanup genau? Möchtest Du nicht viel eher das Disposable Pattern implementern, falls das überhaupt nötig ist? Was hast Du da überhaupt freizugeben???Der Artikel war Vorbild für mein DoublBuffering. Er gibt beim Verlassen der Funktion den genutzten Speicher wieder frei, das finde ich sehr sinnvoll, oder habe ich da etwas gar nicht verstanden?
-
Er gibt beim Verlassen der Funktion den genutzten Speicher wieder frei, das finde ich sehr sinnvoll, oder habe ich da etwas gar nicht verstanden?
Application::ApplicationExit wird beim Beenden des Prozesses ausgeführt - dann kommts sowiso nicht mehr draufan - ich würde Dispose natürlich trozdem aufrufen, aber nicht beim Beenden der Applikation, sondern wenn das Control nicht mehr gebraucht wird. Und das macht man über das Dispose(..) Pattern - so wie es im CP Artikel codiert ist, ist es nicht gut.
EDIT
Das wird übrigens in einem der Kommetare zu dem Artikel auch bemängelt:
http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx?msg=1876528#xx1876528xx
-
theta schrieb:
Application::ApplicationExit wird beim Beenden des Prozesses ausgeführt - dann kommts sowiso nicht mehr draufan - ich würde Dispose natürlich trozdem aufrufen, aber nicht beim Beenden der Applikation, sondern wenn das Control nicht mehr gebraucht wird. Und das macht man über das Dispose(..) Pattern - so wie es im CP Artikel codiert ist, ist es nicht gut.
Wenn ich das richtig verstehe ist das für mein Programm sogar noch einfacher. Die Spielsteine sind im Hauptbildschirm, der kommt nach allen Benutzerabfragen und Einstellungen und bleibt bis das Programm beendet wird oder der Thread neu gestartet wird. Also räumt das Betriebssystem auf, denke ich mal?
theta schrieb:
EDIT
Das wird übrigens in einem der Kommetare zu dem Artikel auch bemängelt:
http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx?msg=1876528#xx1876528xxDie Kommentare zum Artikel hatte ich nicht gelesen. *schäm*
Bisher bin ich soweit gekommen das ich mein Panel auch bewegen kann ohne das es flackert, also eine flüssige Bewegung keinen Sprung. Dafür habe ich folgende Funktion geschrieben. Hat jemand ne Idee wie die Geschwindigkeit der Bewegung langsamer kriege? Und beim ersten Schritt wird leider gaanz kurz der Hintergrund falsch angezeigt.
public: System::Void move( Int32 iDirection, Int32 iStepsToMove ) { // iDirection erwartet: 1 = nach Oben ( Norden ) // 2 = nach Rechts ( Osten ) // 3 = nach Unten ( Süden ) // 4 = nach Links ( Westen ) // iStepsToMove ist die Anzahl an Felder ( 1 oder 2 ) die der Spielstein bewegt werden soll. Int32 iPixelToMove = 0; switch( iStepsToMove ) { case 1: iStepsToMove = 15; // In 4 Pixelschritten bewegen und ein Feld sind 60 Pixel. break; case 2: iStepsToMove = 30; // In 4 Pixelschritten bewegen und zwei Felder sind 120 Pixel. break; default: MessageBox::Show("move() erwartet den zweiten Parameter iStepsToMove zwischen 1 und 2.", "Warnung: move() falsch benutzt!", MessageBoxButtons::OK, MessageBoxIcon::Exclamation); break; } switch( iDirection ) { case 1: for(Int32 n=0 ; n < iStepsToMove ; n++ ) { setPanelPosition( iXCoord, iYCoord - 4 ); } break; case 2: for(Int32 n=0 ; n < iStepsToMove ; n++ ) { setPanelPosition( iXCoord + 4, iYCoord ); } break; case 3: for(Int32 n=0 ; n < iStepsToMove ; n++ ) { setPanelPosition( iXCoord, iYCoord + 4 ); } break; case 4: for(Int32 n=0 ; n < iStepsToMove ; n++ ) { setPanelPosition( iXCoord - 4, iYCoord ); } break; default: MessageBox::Show("move() erwartet den ersten Parameter iDirection zwischen 1 und 4.", "Warnung: move() falsch benutzt!", MessageBoxButtons::OK, MessageBoxIcon::Exclamation); break; } }
Auch würde ich gern mein Objekt drehen, dazu habe ich die RotateTransform() Methode gefunden die ich in meiner onPaint nutzen könnte, da diese System::Drawing::Graphics^ e braucht, wie kann ich eine Funktion schreiben die meinen Panel dreht oder muss ich die Klasse nochmal ableiten und das dort im onPaint machen? Hier meine onPaint.
private: void DrawImage( System::Drawing::Graphics^ e ) { // baue ein Paralellogramm fuer das Hintergrundbild, also den Spielplan. Point pUlCorner = Point( ( ( iXCoord + 1 ) *(-1) ), ( ( iYCoord + 1 ) *(-1) ) ); Point pUrCorner = Point( ( ( iXCoord + 1 ) *(-1) +720 ), ( ( iYCoord + 1 ) *(-1) ) ); Point pLlCorner = Point( ( iXCoord *(-1) ), ( iYCoord *(-1) ) + 720 ); array<Point>^ parallelogram = {pUlCorner,pUrCorner,pLlCorner}; e->DrawImage( imObjektFloor, parallelogram ); // Zeichne erst den Spielplan ins Paralellogramm, e->DrawImage( imObjekt, 0, 0 ); // dann den Roboter drauf. }
Danke für eure Zeit und Hilfe