[c++ builder] flitsen bij repaint

Pagina: 1
Acties:

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 01-02 09:13
Ik heb een schema van een dynamisch systeem wat berkend wordt en per tijd verandert.
Dit schema plot ik op een image.

Het probleem is dat telkens alles gaat knipperen. En vooral de achtergrond.
Het is dus een wit vlak waar wat lijnen en bolletjes op staan die telkens veranderen.

Is het mogelijk dit knipperen tegen te gaan? en dan vooral van de achtergrond omdat deze hinderlijk zijn.

if broken it is, fix it you should


Verwijderd

Double buffering gaat dit probleem tegen.

Waarschijnlijk moet je ergens aangeven (in de code of in de instellingen) dat je double buffering wilt gebruiken. Zoek eens met google "c++ builder double buffer"

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15-02 11:20
BitBlt

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 01-02 09:13

if broken it is, fix it you should


  • writser
  • Registratie: Mei 2000
  • Laatst online: 10-02 20:24
Google eens op 'BitBlt'. De eerste link brengt je naar de officiele MSDN pagina van de BitBlt functie. De derde link brengt je op een wikipedia pagina die precies uitlegt wat blitten is. De vierde link is een complete tutorial in c die laat zien hoe je blitten gebruikt in Windows om graphics op het scherm te krijgen. Lees alles eens door en kom dan weer terug als je er niet uit komt .. :P

Onvoorstelbaar!


  • klinz
  • Registratie: Maart 2002
  • Laatst online: 18-11-2025

klinz

weet van NIETS

In C++Builder kun je dit op eenvoudiger wijze doen door bij het creëren van het component:

csOpaque toe te voegen aan de ControlStyle van het component. Dit zorgt ervoor dat de achtergrondkleur niet gewist wordt en voorkomt dus al een deel van het probleem;
• Creëer vervolgens een TBitmap met dezelfde grootte als de Canvas van het component.

Bij iedere iteratie:

• Wis de TBitmap of vul deze met een achtergrondkleur.
• Teken op de TBitmap i.p.v. op het Canvas van het component.
• Als je klaar bent met tekenen, gebruik je TCanvas::Draw() om deze bitmap in een keer naar de Canvas van het component te kopieren.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Of kijk eens of de DoubleBuffer property van TForm helpt.

We adore chaos because we like to restore order - M.C. Escher


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 01-02 09:13
klinz schreef op woensdag 05 juli 2006 @ 19:02:
In C++Builder kun je dit op eenvoudiger wijze doen door bij het creëren van het component:

csOpaque toe te voegen aan de ControlStyle van het component. Dit zorgt ervoor dat de achtergrondkleur niet gewist wordt en voorkomt dus al een deel van het probleem;
• Creëer vervolgens een TBitmap met dezelfde grootte als de Canvas van het component.

Bij iedere iteratie:

• Wis de TBitmap of vul deze met een achtergrondkleur.
• Teken op de TBitmap i.p.v. op het Canvas van het component.
• Als je klaar bent met tekenen, gebruik je TCanvas::Draw() om deze bitmap in een keer naar de Canvas van het component te kopieren.
Ik heb nu het volgende gedaan:
Image 1 is waar ik in wil tekenen:

C++:
1
Image1->ControlStyle << csOpaque; // instellen csOpaque

en bij de iteratiestap:
C++:
1
2
3
4
5
6
7
8
9
10
Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
pBitmap->Width=Image1->Width;
pBitmap->Height=Image1->Height;
TCanvas *pCanvas=pBitmap->Canvas;

//.....
// hier wordt pCanvas vol getekend

Image1->Canvas->Draw(0,0,pBitmap);
delete pBitmap;


maar nog steeds blijft hij knipperen

[ Voor 3% gewijzigd door elgringo op 06-07-2006 11:26 ]

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 01-02 09:13
Iemand?

if broken it is, fix it you should


  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 07-02 20:14
In VB.NET gebruik ik deze code in de initialisatie van het formulier waarop het flikkeren gebeurt om dat te voorkomen:


code:
1
2
3
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        Me.SetStyle(ControlStyles.UserPaint, True)
        Me.SetStyle(ControlStyles.DoubleBuffer, True)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15-02 11:20
Om zonder flitsen te kunnen tekenen moet je tekenen op een bitmap( TCanvas?) die dezelfde eigenschappen heeft als het ding dat je wilt laten zien, die echter alleen in het geheugen staat.

Als je klaar bent met pielen op die bitmap 'blit' je 'em in een keer naar je DC ( TBitmap? ) met BitBlt of StretchBlt.

Dat ijkt me ook ongeveer de strekking van jouw code ( ken cbuilder niet goed ) , maar ik weet niet of er misschien eigenschappen zijn van die objecten die er voor zorgen dat het toch noch gaat knipperen. ( Autorepaint en dat soort dingen )

Kan je dus ( zonder wat meer info ) niet echt verder helpen ben ik bang

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 01-02 09:13
Ik had csOpaque (die zorgt dat achtergrond niet gewist wordt) voor het formulier en niet voor Image 1 in moeten stellen... |:(

Nu werkt het wel

if broken it is, fix it you should

Pagina: 1