Poznáváme C# a Microsoft.NET 28. díl – HashProvidery a Klonování

Diskuze čtenářů k článku

milos  |  20. 06. 2005 08:52  | 

Ale predsa je to o .NET a C# takze:
double buffering GDI+
Snazim sa kreslit na Panel pohybujuce sa ciary. Samozrejem ze pri prekresleni blikaju. Tak som sa snazil riesit to s pomocou Double buffera. Docital som sa ze ked kreslim na Control da sa zapnut automaticky double buffering takto:
this.Set style (Control style s.DoubleBuffer | Control style s.UserPaint | Control style s.AllPaintingInWmPaint, true);
this.Update style s();
lenze panel nema funkciu Set style . Tuto funkciu ma len Form. Ked to zapnem na form a kreslim na form tak sa double buffer pouziva a teda obrazok neblika. Lenze ak kreslim na panel obrazok na paneli blika.
Skusal som teda manualny double buffer. Teda najprv niekde obrazok do pamate nakreslit a ked je nakresleny tak ho iba skopirovat na panel.

takze som skusil toto
Bitmap BackBuffer = new Bitmap(this.ClientSize.Width,this.ClientSize.Height);
Grap hics DrawingArea = Graphics.FromImage(BackBuffer);
Graphics Viewable = Panel.CreateGraphics();

potom som zavolal funkciu ktora vymazala obsah DrawingArea teda
DrawingArea.Clear(Color.Black)
dalej som nakreslil obrazok do DrawingArea
a nakoniec skopiroval obsah bitmapy na ktoru som kreslil do Graphicsu Panela

Viewable.DrawImageUnscaled(BackBuffer, 0, 0);

No a blika to aj tak ... mate niekto nejake napady ako to osetrit?

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petr  |  24. 06. 2005 12:54  | 

Trida Panel ma metodu Set style  uz proto ze je to potomek tridy Control. A nastaveni vlastnosti DoubleBuffer
na panelu funguje

Souhlasím  |  Nesouhlasím  |  Odpovědět
cowgaRpoboxSlovenskaKoruna  |  24. 06. 2005 15:51  | 

presne tak, presnejsie:

Teda Panel ma "funkciu" Set style . Je to vsak PROTECTED metoda jeho objektovo nadradenej triedy Control, z ktorej vo frameworku dedi. Teda aj kazda trieda z Control odvodena(Form, Panel atd) ju moze pouzivat, ale len v ramci definovania objektoveho typu, tak ako to robis pri public class Form1:S.W.F.Form, hoci si si to asi neuvedomil.
Je samozrejme, ze ked je protected, tak to nemozes pouzivat priamo s instanciou tejto triedy(encapsulation is da 1st rula of OOP!).
To tvoje double buffer, imho ani sam nevies co tam robis :)

nasleduje 'tard Yoda: guidance some I give ya can
-----------------------------
public class MojPanel : System.Windows.Forms.Panel
{
public MojPanel() : base()
{
//nastavis par bitov tejto control na true, mozes si nato urobit aj public properties a robit to zvonku, default su asi true, false, false

//panel sa vykresluje sam, WM_PAINT nie su posielane dalej, je true default
this.Set style (Control style s.UserPaint, true);
//znizis flickering, tym ze OnPaintBackground(aj OnPaint) budu volane priamo z WM_PAINT
this.Set style (Control style s.AllPaintingInWmPai nt, true);
//double buffered vykreslovanie
this.Set style (Control style s.DoubleBuffer, true);
//toto teraz presne neviem, nemozem oskusat, niesom vo VS
this.Update style ();
}

//vykreslovanie mozme riesit hned v redrawingu, vyvola ho ho paint event
protected override void OnPaintBackground(PaintEventArgs pEvent)
{
base.OnPaintBackground (pEvent);

try
{
//nepotrebujem vytvarat Bitmap(ale neublizi, len potom dispose)
//Bitmap mojObrazok = new Bitmap(@"c:\resources\milkme.gif");
Image mojImage = Image.FromFile(@"c:\resources\milkme.gif");

//tu mozes ziskat plochu, ktoru staci repaintovat
Rectangle areaRepainting = pEvent.ClipRectangle;

//Nevytvarame si novy Graphics object(.NET wrapper okolo windows device context objektu),
//ale vycuciame referenciu na nho(z formalneho parametra pEvent) a toto "graphics platno" pouzijeme.
//I ked je zvyk drzat Graphics objekty len nevyhnutnu dobu, NEMAL by si na tomto volat Dispose(),
//ty si ho nevytvoril, nieje na tebe aby si ho disposol!

Graphics gr = pEvent.Graphics;
gr.DrawImageUnscaled(mojImage, 10, 10);
//?? gr.DrawImageUnscaled(mojImage, ??, areaRepainting);
}

catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "Netcraft confirms You've milked me !", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
}
}
--------------- -----
Teraz staci vytvorit instancie typu MojPanel(treba ho ale doladit, dynamicke prekreslovanie a celkovo...to je iba vytah).
este sa mozes pohrat s:

this.Invalidate() -> ak potrebujes repaintnut control(postupne sa vyvola paint event a dany event handler)
this.Update() -> to iste len sa to zavola okamzite
this.SuspendLayout()
this.ResumeLayout() --> jasne...

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
24. 11. 2007 13:30 | 

Programovou oflline verzi seriálu naleznete ke stažení na http://poznavame-c-msnet.wz.cz/

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zasílat názory e-mailem: Zasílat názory Můj názor
Aktuální číslo časopisu Computer

Velký test fitness náramků

Levné záložní zdroje

Jak si zabezpečit domov

Nejlepší monitory na trhu