Проблема С Мерцанием

  • Автор темы Автор темы BadWolf
  • Дата начала Дата начала
B

BadWolf

Есть задание - сделать подобие механических часов.
Часы рисуются, стрелки устанавливаются правильно, но экран постоянно мерцает. Как с этим можно бороться.
Вот код события таймера

C++:
	private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
label1->Text = String::Format("{0:T}", DateTime::Now);
int S,M,H; //переменные для хранения текущих секунд, минут и часов 
if (label1->Text->Length==8) 
{
String^ Mx = Convert::ToString(label1->Text[6]);
String^ Mxx = Convert::ToString(label1->Text[7]);
Mx +=Mxx;
S = Convert::ToInt32(Mx);
Mx = Convert::ToString(label1->Text[3]);
Mxx = Convert::ToString(label1->Text[4]);
Mx +=Mxx;
M = Convert::ToInt32(Mx);
Mx = Convert::ToString(label1->Text[0]);
Mxx = Convert::ToString(label1->Text[1]);
Mx +=Mxx;
H = Convert::ToInt32(Mx);
if (H>12) H -=12;
}
else
{
String^ Mx = Convert::ToString(label1->Text[5]);
String^ Mxx = Convert::ToString(label1->Text[6]);
Mx +=Mxx;
S = Convert::ToInt32(Mx);
Mx = Convert::ToString(label1->Text[2]);
Mxx = Convert::ToString(label1->Text[3]);
Mx +=Mxx;
M = Convert::ToInt32(Mx);
Mx = Convert::ToString(label1->Text[0]);
H = Convert::ToInt32(Mx);

};
// здесь собственно начинается прорисовка
Graphics^ Graf = pictureBox1->CreateGraphics();
Brush^ brush = gcnew SolidBrush(Color::White);
Graf->Clear(SystemColors::Control);
Graf->FillEllipse(brush, 0,0,200,200);
brush = gcnew SolidBrush(Color::Red);
for (int i=0; i<12; ++i)
{
int a,b;
a = 100 + 95*Math::Sin(i*2*Math::PI / 12);
b = 100 + 95*Math::Cos(i*2*Math::PI / 12);
Graf->FillEllipse(brush, a-4, b-4, 8, 8);
};
Pen^ pen = gcnew Pen(Color::Black);
int x,y;
x = 100 + 80*Math::Cos(((S*Math::PI)/30)-Math::PI/2);
y = 100 + 80*Math::Sin(((S*Math::PI)/30)-Math::PI/2);
Graf->DrawLine(pen, 100,100,x,y);
pen->Width = 2;
pen->Color = Color::Blue;
x = 100 + 65*Math::Cos(((M*Math::PI)/30)-Math::PI/2);
y = 100 + 65*Math::Sin(((M*Math::PI)/30)-Math::PI/2);
Graf->DrawLine(pen, 100,100,x,y);
x = 100 + 50*Math::Cos(((H*Math::PI)/6)+(60*M*Math::PI/21600)-Math::PI/2);
y = 100 + 50*Math::Sin(((H*Math::PI)/6)+(60*M*Math::PI/21600)-Math::PI/2);
pen->Width = 3;
pen->Color = Color::Green;
Graf->DrawLine(pen, 100,100,x,y);				
}
 
создавайте в памяти объект Graphics и рисуйте в нем. Потом прорисовывайте картинку на своем устройстве вывода. Это называется буферизацией. Многих проблем позволяет избежать. Тем более, если в основе графики в .НЕТ лежит старая добрая (или нет?) GDI+
 
Точнее это называется "двойная буферизация". Для .NET-а/GDI+ примеров должно быть завались.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!