Rajzolás a képernyőre közvetlenül

Rajzolás a képernyőre közvetlenül
2017-07-16T13:23:38+02:00
2017-07-16T15:36:37+02:00
2022-10-15T22:41:54+02:00
anclung
Az alábbi program kiír a grafikus képernyőre egy "Hello Word!"-ot. Eredetileg úgy csináltam, hogy a form-ra tettem egy gombot, és annak a button_Click eseménykezelőjébe tettem a kiíratást.

Mivel azonban igazából button nélkül, közvetlenül szeretnék rajzolni a képernyőre, megpróbáltam a form-nak a load eseményéhez rendelni a kiíratást (a kódban jelenleg ki van kommentelve ez a rész). Ennek hatására azonban nem írt ki az ablakba semmit.

Ezt követően kigugliztam, hogy a dolgot egy új PaintEventHandler (paint eseményfigyelő) létrehozásával kell megoldani. Így működik is a dolog.

Ami nem világos ebben az egészben, hogy a kiíratás a form-nak pusztán a load eseményével miért nem megy a button_Click mintájára, és hogyha ezt egy PaintEventHandler definiálásával kell megoldani, akkor mit jelent pontosan az, hogy:

Paint += new PaintEventHandler(Drawing);

Ha valaki egy-két mondatban egyszerűen leírná hogy hogy is van ez, azt megköszönném.

public partial class Form1 : Form { Graphics g; SolidBrush brush = new SolidBrush(Color.Blue); public Form1() { InitializeComponent(); g = CreateGraphics(); Paint += new PaintEventHandler(Drawing); } //private void button_Click(object sender, MouseEventArgs e) //{ // g.DrawString("Hello World!", new Font("Arial", 12), brush, 10, 10); //} void Drawing(object sender, PaintEventArgs e) { g.DrawString("Hello World!", new Font("Arial", 12), brush, 10, 10); } //private void Form1_Load(object sender, EventArgs e) //{ // g.DrawString("Hello World!", new Font("Arial", 12), brush, 10, 10); //} }
Mutasd a teljes hozzászólást!
Két dolog történik:
- van egy metódusod, ami történetesen úgy néz ki, mint egy paint eseménykezelő
- és ezt élesíted paint eseménykezelőként
Az első lépés történik a "void Drawing(object sender, PaintEventArgs e)" létrehozásával, de a futtatókörnyezet csak onnantól fogja ezt a metódust hívogatni, hogy a "Paint += new PaintEventHandler(Drawing)" sor megtörtént.
A paint esemény azért érdekes, mert mindahányszor meghívásra kerülhet, amikor az oprendszer (vagy a futtatókörnyezet) "nem emlékszik" az ablakod tartalmára. Pl. minimalizálás után, meg ha egy másik ablak eltakarja. Azért a feltételes mód, mert a grafikus alrendszer ma már meglehetősen sokáig emlékszik egy-egy ablakra.
Ehhez képest amit létrehozáskor, gombnyomáskor rajzolsz, elvileg elveszhet - a klasszikus megközelítés szerint gombnyomásra nem rajzolnál semmit, hanem tagváltozóban eltárolnád, hogy most már a szöveget is ki kell rajzolni, majd küldenél egy repaint kérést a környezetnek (itt épp Control.Invalidate a neve - ha nagyon "sürgős", Refresh), ami generálna egy paint eseményt és így meghívná a Drawing metódusodat, ahol a tagváltozóid vizsgálata alapján eldöntenéd, hogy most épp miket kell és miket nem kell kirajzolnod.
Szóval ha a gombnyomásból történő rajzolás esetleg működik is, az a grafikus alrendszer jóságos gyorstárazásának köszönhető, a dokumentáció ilyet nem ígér sőt, a CreateGraphics eredményének tárolgatását sem javasolja (Control.CreateGraphics Method (System.Windows.Forms) ), a Drawing metódusodban kéne létrehozni, beállítani, rajzolni, és felszabadítani.
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd