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