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

Тема в разделе "MS Visual C++", создана пользователем BadWolf, 8 апр 2012.

  1. BadWolf

    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);              
    }
     
  2. VerhoLom

    VerhoLom Гость

    создавайте в памяти объект Graphics и рисуйте в нем. Потом прорисовывайте картинку на своем устройстве вывода. Это называется буферизацией. Многих проблем позволяет избежать. Тем более, если в основе графики в .НЕТ лежит старая добрая (или нет?) GDI+
     
  3. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    Точнее это называется "двойная буферизация". Для .NET-а/GDI+ примеров должно быть завались.
     
Загрузка...
Похожие Темы - Проблема Мерцанием
  1. c0de3r
    Ответов:
    5
    Просмотров:
    116
  2. DobermannTT
    Ответов:
    10
    Просмотров:
    133
  3. SoulPaladin
    Ответов:
    3
    Просмотров:
    122
  4. Artael
    Ответов:
    1
    Просмотров:
    109
  5. ENSLER
    Ответов:
    0
    Просмотров:
    102

Поделиться этой страницей