Eine Analoge Uhr



  • Hallo ...

    Eine Analoge Uhr welche in einem Panel gezeichnet werden soll:

    ...
    ...
    
    	myGraphics = panel1->CreateGraphics ();
    	myGraphics->SmoothingMode = System::Drawing::Drawing2D::SmoothingMode::AntiAlias;	
    
    	//Mittelpunkt der Uhr
    	Mittelpunkt = Point(panel1->Size.Width / 2, panel1->Size.Height / 2);
    
    	myPen  = gcnew System::Drawing::Pen(System::Drawing::Color::White, 2);
    	myPenSEK  = gcnew System::Drawing::Pen(System::Drawing::Color::Red, 1);
    	gb = gcnew System::Drawing::Drawing2D::LinearGradientBrush (Mittelpunkt,System::Drawing::Point (0,45), Color::White, Color::Black);
    	myPen->Brush = gb;
    
    	//Timer starten
    	zeit = DateTime::Now; // Interval 1000ms
    ...
    ...
    ...
    private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) 
    			 {
    			 //Uhr zeichnen und aktualisieren
    			 zeit = DateTime::Now;
    			 if (backgroundWorker1->IsBusy == false) backgroundWorker1->RunWorkerAsync ();
    			 }
    ...
    ...
    ...
    private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) 
    			 {
    			 //Uhrzeit zeichnen
                             backgroundWorker1->ReportProgress (1);
    			 //Sekunden Zeiger	
    				if (showsec == 1)
    					{		
    					myGraphics->ResetTransform();
    					myGraphics->TranslateTransform(Mittelpunkt.X, Mittelpunkt.Y);
    					myGraphics->RotateTransform(zeit.Second * 6.0f + 180.0f);			
    					myGraphics->DrawLine(myPenSEK, 0, 0, 0, 45);	
    					}
    
    				//Minuten Zeiger
    				myGraphics->ResetTransform();
    				myGraphics->TranslateTransform(Mittelpunkt.X, Mittelpunkt.Y);
    				myGraphics->RotateTransform(zeit.Minute * 6.0f + 180.0f);		
    				myGraphics->DrawLine(Pens::Green, 0, 0, 0, 45);
    
    				//Stunden Zeiger
    				myGraphics->ResetTransform();
    				myGraphics->TranslateTransform(Mittelpunkt.X, Mittelpunkt.Y);
    				myGraphics->RotateTransform(zeit.Hour * 30.0f + 180.0f);		
    				myGraphics->DrawLine(myPen, 0, 0, 0, 25);
    
    			 }
    private: System::Void backgroundWorker1_ProgressChanged(System::Object^  sender, System::ComponentModel::ProgressChangedEventArgs^  e) 
    			 {
    			 //Cross Thread Operation
    			 panel1->Refresh ();
    			 }
    ..
    ...
    ...
    

    Meine Probleme hierbei: Der Sekundenzeiger wird ja recht häufig neu gezeichnet. Wenn ich nach jedem aufruf das Panel via ReportProgress neu zeichnen lassen möchte, flackert es doch ziemlich unangenehm. Gibt es nicht eine Möglichkeit nur den gezeichneten Zeiger zu löschen? myGraphics->Clear (...) bringt mich hier nicht weiter - da das Panel transparent bleiben sollte. Habt ihr eine Lösung dafür?



  • ...
    myGrphyk.ResetTransform();
    myGrphyk.TranslateTransform(Mittelpunkt.X, Mittelpunkt.Y);
    myGrphyk.RotateTransform((zeit.Second * 6.0f + 180.0f)-6.0f);
    System.Drawing.Pen radirer = new Pen(Color.White, 2);
    myGrphyk.DrawLine(radirer, 0, 0, 0, 97);
    ...

    ist zwar nicht die beste Lösung ab es funktioniert


Log in to reply