Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Odświeżanie ekranu

cygan001 06 Mar 2008 13:51 1785 3
  • #1 06 Mar 2008 13:51
    cygan001
    Poziom 11  

    Witam, chciałbym zrobić płynne rysowanie przebiegów w środowisku Borland C++ builder 6, aplikacja pod windows. Odświeżanie obrazu powoduje migotanie. Jak odświeżać ekran żeby wyeliminować migotanie? Byłbym wdzięczny za jakikolwiek przykład.

    0 3
  • #2 06 Mar 2008 18:07
    ostrytomasz
    Poziom 22  

    Z użyciem TPaintBox np. tak:

    Code:

    #include <Graphics.hpp>

    w deklaracji klasy czy przestrzeni globalnej:
    Graphics::TBitmap *DoubleBuffer;

    w OnCreate:
    DoubleBuffer = new Graphics::TBitmap;
    DoubleBuffer->Height=PaintBox1->Height;
    DoubleBuffer->Width=PaintBox1->Width;
    PaintBox1->ControlStyle = PaintBox1->ControlStyle << csOpaque;

    rysowanie:
    DoubleBuffer->Canvas->Brush->Color=clBlack;
    DoubleBuffer->Canvas->Pen->Color=clDkGray;
    //etc.
    Form1->PaintBox1->Canvas->Draw(0,0,DoubleBuffer);

    OnPaint dla PaintBox1:
    Form1->PaintBox1->Canvas->Draw(0,0,DoubleBuffer);

    w OnDestroy
    delete DoubleBuffer


    Inaczej - bez pośredniczącego bufora (przebieg uaktualniany cały czas)
    http://ostry.w.szu.pl/soft.php#audioscope

    Jeżeli ma działać szybciej trzeba sięgnąć po DirectDraw/OpenGL.

    0
  • #3 06 Mar 2008 19:35
    cygan001
    Poziom 11  

    Podwójne buforowanie zadziałało, to dla mnie wystarczy. Dzięki
    Mógłbym prosić jeszcze o wyjaśnienie drugiej metody? Lub o jakieś materiały?

    0
  • Pomocny post
    #4 06 Mar 2008 21:20
    ostrytomasz
    Poziom 22  

    Nie ma chyba w zasadzie czego wyjaśniać, przy callbacku dla wave in (dostępne są nowe próbki) wywoływany (Resume) jest wątek DrawThread który zawłaszcza sobie dostęp do TPaintbox (lock/unlock), rysuje to co wynika z próbek i usypia się (Suspend). Gdyby nowe próbki nie były dostarczane na bieżąco przydałoby się też obsłużyć OnPaint dla TPaintBox (przechowywać gdzieś ostatnią partię próbek). Rysowanie w osobnym wątku może być użyteczne gdy tego rysowania jest dużo, z drugiej strony można też przyspieszyć rysowanie stosując jakiś dodatkowy bufor pośredni, umieszczając tam wszystkie niezmienne elementy a następnie korzystając z niego jak z tła.
    Próbowałem DirectDraw, wszystko co potrzebne jest w BCB (ddraw.h/ddraw.lib), są ogólnodostępne tutoriale, ale GDI jest moim zdaniem wystarczające do prostych wykresów.

    0