Dvojité bufferování   zodpovězená otázka

VB.NET, WinForms, Grafika

Dobrý den,

Kreslím do Dim gIMG As Graphics = Graphics.FromImage(imgPicture). Při volání Me.Invalidate() se displej překreslí a celý blikne, jako by na moment zhasl a ihned se zobrazí znovu. Lze u tohoto způsobu vykreslování nějak použít dvojité bufferování, nebo nějak jinak omezit ono poměrně nepříjemné bliknutí?

Tento způsob kreslení byl zvolený proto, že jsou změny grafiky vyvolány z mnoha funkcí, kde jsou porovnávány hodnoty 0-1 a vykresluje se pak graficky několik set provozních stavů.

Děkuji za radu a pomoc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přesunul jsem dotaz do fóra Visual Basic .NET, v dotazech o VB6 nemá co dělat.

Dvojité bufferování zapnete tak, že formuláři nastavíte vlastnost DoubleBuffered na True. Také doporučuji overridnout metodu PaintBackground, aby se nepřekreslovalo pozadí (to toži způsobuje to bliknutí). Do formuláře vložte tuto metodu a nedávejte dovnitř žádný kód:

Protected Override OnPaintBackground(sender As Object, e As PaintEventArgs)
End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to je velmi krkolomný postup, který podle mě ani nebude fungovat. Skutečné dvojité bufferování se totiž nastavuje metodou SetStyle... Samotné nastavení DoubleBuffered na True nemá žádný účinek.

Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or _
            ControlStyles.OptimizedDoubleBuffer Or _
            ControlStyles.ResizeRedraw, _
            True)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den, po delším čase jsem se vrátil zpět k tomuto problému a zatím je to tak, jak píšete, pomocí vloženého kódu:

    Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs) End Sub

(za Protected je upraveno na Overrides Sub) opravdu blikání přestalo a vykreslování běží, pokud jsem použil kód uvedený panem Linhartem, nepřekreslovalo se nic.

Každopádně Vám oběma děkuji za radu a pomoc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nepřekreslovalo se vám nic, protože jste to použil jinak než na co je to určeno. Můj kód je určen pro eliminaci blikání při přímém kreslení na Form v události Paint, ne na kreslení do objektu Graphics vytvořeného z bitové mapy.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Omlouvám se za chybné zařazení a děkuji za korekci.

Bohužel, ani jedna metoda mně zatím nedovedla k lepšímu výsledku. Pokud zapnu ve formuláři dvojité bufferování, to co kreslím do gIMG se vůbec nezobrazí, pouze krátce problikne. Proběhne-li kód podle druhé metody, to, co bylo vykresleno pomocí gIMG zmizí. Problém je asi v tom, že neumím směřovat grafický výstup na formulář nějak jinak, než pomocí kreslení do gIMG a jeho následné zobrazení ve formuláři.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback