grafikus kimenet
Abban az időben, amikor bármely része az ablak el van rejtve, rejtett képpont hiányzik, mert a Windows felszabadítja a memóriát elfoglalták. Azonban, ő úgy emlékszik, hogy az ablak rejtve vannak, és amikor rájön, hogy ez az ablak ismét nyitva van, az alkalmazás megkérdezi a tulajdonos ablakban dolgozza át annak tartalmát. Van néhány kivétel e szabály alól - általában, amikor eltüntetésével egy nagyon kis része a Windows egy rövid ideig (jó példa erre a választás fő menüpont, ha kiesik a almenü átmenetileg részét fedező ablakban). Általában akkor számíthat, ha az ablak rejtve maradt, akkor a kérelem dolgozza át azt.
Ez az, ami okozza a hibát a példa alkalmazás. Azt hogy a rajz kód a Form1 kivitelező, amely az úgynevezett csak egyszer, amikor az alkalmazás elindul, és nem tudjuk hívni a kivitelező ismét, hogy dolgozza át a számokat, ha később szükség.
Amikor dolgozik a Windows Forms ellenőrzések nem szükséges tudni semmit, hogy hogyan oldották meg ezt a problémát. Az a tény, hogy a standard ellenőrzés meglehetősen bonyolult, és tudják, hogyan kell újrarajzolása bármikor, amikor a Windows megkérdezi őket róla. Ez megmagyarázza, hogy miért programvezérlői, nem kell aggódnia, az aktuális folyamat festés. Ha vesszük a felelősséget megjelenítő képernyőn az alkalmazás, akkor azt is biztosítanunk kell, hogy az alkalmazás helyesen reagálni a Windows kérdéseket az átfestés minden része az ablakokon. A következő részben fogjuk tenni a szükséges változtatásokat tenni.
Rajz áramköri OnPaint ()
Ne aggódjon, ha a korábbi magyarázatok a benyomást keltették, hogy a festmény a saját felhasználói felületet úgy néz ki borzasztóan nehéz. Mert a kérelmet, hogy dolgozza át magát, amikor szükség van rá, sőt, nagyon egyszerű.
A Windows értesíti az alkalmazási amely előírja, újrafestés, növelve a Paint eseményt. Érdekes, hogy a Form osztály már végrehajtotta a felvezető ez az esemény, így nem kell hozzá magad. Festék Form1 eseménykezelő tartalmaz egy virtuális módszert OnPaint (). amelyet át egyetlen paraméter PaintEventArgs. Ez azt jelenti, hogy minden, amit tennie kell -, hogy felülbírálja a OnPaint (). hogy ő végzett a megkövetelt rajz nekünk.
Ebben a részben, akkor hozzon létre egy új Windows-alapú alkalmazás, DrwShapes. Mint korábban, a fehér háttér színét a Tulajdonságok ablakot. Ezen kívül módosíthatja a szöveg doboz DrawShapes minta. Ezután adjuk hozzá a következő részlet, hogy a generált kód a Form1.
protected override void OnPaint (PaintEventArgs e)
Graphics dc = e.Graphics;
Pen bluePen = új Pen (Color.Blue, 3);
Pen redPen = új Pen (Color.Red, 2);
dc.DrawEllipse (redPen, 0, 50, 80, 60);
Felhívjuk figyelmét, hogy a OnPaint () metódus nyilvánították védett, mert ez általában használható egy osztályon belül, így nincs oka bármilyen kódot az osztályon kívül tudatában létezésének.
PaintEventArgs - Ez az örökös osztály EventArgs, általánosan használt információk továbbítására az eseményeket. PaintEventArgs két további tulajdonságai, annál fontosabb a számukra - ez egy példánya Graphics, már előkészített és optimalizált rajz a jobb oldalon. Ez azt jelenti, hogy nem kell a OnPaint () metódus hívások CreateGraphics (), hogy a DC - mi már eltelt. Hamarosan mi is nézd meg a második további ingatlanok; Ez tartalmazza a részletes információkat, hogy milyen területen az ablak tényleg kell rajzolni.
A mi végrehajtása OnPaint (a) az első dolog, amit kap egy hivatkozást Graphics objektumot PaintEventArgs, akkor hívják fel a számokat, csak úgy, mint azelőtt. Végén hívás OnPaint () metódus a szülő osztály. Ez a fontos lépés. Mi újra OnPaint () elvégzésére saját festés, de lehetséges, hogy a Windows lehet, hogy több munkát kell végezni a rajzolás folyamata - mindez munkát fog végezni a módszer OnPaint () egyik .NET alap osztályban.
Ebben a példában, ha eltávolítja a kivágás OnPaint () a szülő osztály, akkor nem lát különösebb hatással. De nem kell ellenállni a kísértésnek, hogy hagyjon fel a hívást. Ez megzavarhatja a normális működését a Windows és az eredmények is nepredskazuemsmi.
OnPaint () metódus is nevezik, amikor a kezdeti alkalmazás elindításakor, amikor az első ablak jelenik meg a képernyőn. A tie ezzel nincs szükség megismételni a rajz kódot a kivitelező.
Ábra. 33.2. Az eredmény példa DrawShapes alakú átfedő másik ablakban
Futás a kódot kezdetben ugyanazt az eredményt adja, mint az előző példában, azzal az eltéréssel, hogy most mi alkalmazás viselkedik helyesen, ha minimálisra ablakok vagy elrejtik részeit.
Egy levágott régió
Mintaalkalmazás DrawShapes az előző részben bemutatjuk a fő elveket vonatkozó rajz az ablakok, bár ez nem túl hatékony. Az ok összefügg a kísérlet felhívni mindent az ablakon, nem számít, hogy hány elem ténylegesen meg kell rajzolni. Ábra. 33.2 eredményét mutatja például DrawShapes majd egy ablak jelenik meg, és a mozgó át formájában DrawShapes úgy, hogy annak egy részét borítja.
Eddig jó. Azonban, amikor mozog a blokkolt ablakot, hogy DrawShapes ablak teljesen újra látható, akkor a Windows a szokásos módon, küldjük a forma festék esetén kikérve kell rajzolni. A téglalap és ellipszis található a bal felső sarokban az ügyfél terület, és ezért továbbra is látható legyen. Így valójában nem volt szükség, hogy dolgozza át őket az idő, ráadásul átfestés a fehér háttér ablakban. Azonban a Windows nem tudja ezt, és ezért azt meg kell generálni a Paint esemény, amely elvezet a megvalósulását hívás OnPaint (). És ez a felismerés egy teljesen felesleges dolgozza át a téglalap és ellipszis.
Ennek eredményeként a kérelem egy példányát Graphics végre valami rajz kívül az érvénytelenített területen szinte biztosan vezet a hulladék CPU időt, és lassítják az alkalmazást. Egy jól megtervezett alkalmazás kódját kell segítenie az eszköz keretében végző néhány egyszerű ellenőrzéseket, hogy megbizonyosodjon arról, hogy nem kerül sor felesleges híváskísérleteinek Graphics metódusai. Ebben a részben, akkor kódolni egy új példa DrawShapesWithClipping, módosítjuk a korábbi DisplayShapes. A OnPaint () kód egyszerű ellenőrzéseket fognak végezni annak érdekében, hogy az érvénytelen területen átfedésben van a terület, ahol szeretne rajzolni, és csak akkor, ha ez az eset áll fenn, rajz végezzük.
Először is meg kell, hogy információt kapjon a kivágott rész. Ehhez szükségünk lesz egy új tulajdonság osztály ClipRectangle PaintEventArgs. ClipRectangle ingatlan tartalmaz koordináta rajzolni területen van berendezve, mint egy példány System.Drawing.Rectangle szerkezetét. Ez egy viszonylag egyszerű szerkezet - ez négy tulajdonságai érdekelnek minket: felső, alsó,