Problém s GDI+   otázka

C#

Dobrý den, mám takový problém, když kreslim s GDI, tak mi to funguje pouze když kreslící kód dám do nějakého eventu(button_click) a nebo do metody OnPaint, ale když to dám do konstruktoru, tak to nefunguje, ale jsem si jist, že dříve to fungovalo, nevíte kde je problém, přihazuji ještě kód:

 Graphics g;

        public Form1() //Nefunguje
        {
            InitializeComponent();
            g = this.CreateGraphics();
            g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(0, 0, 15, 15));
            g.Dispose();
        }

        private void button1_Click(object sender, EventArgs e)
        { //Funguje
            g = this.CreateGraphics();
            g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(0, 0, 15, 15));
            g.Dispose();
        }

        protected override void OnPaint(PaintEventArgs e)
        { // Funguje
            g = e.Graphics;
            g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(0, 0, 15, 15));
            g.Dispose();
            base.OnPaint(e);
        }

Děkuji za jakoukoli radu.

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

Zkuste si na ten Button kliknout a změnit velikost okna, nebo jej minimalizovat a maximalizovat. Obsah nakreslený tak, jak jej kreslíte Vy zůstane vidět jen dokud nepřijde zpráva na překreslení formuláře/komponenty. Nechte vykreslování v OnPaint, tam by to mělo fungovat v pořádku.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Má přepisování (Override) metody OnPaint nějaký zvláštní význam? Proč nepoužijete událost Paint? Rovněž se mi nelíbí uvolňování Graphics hned po FillRectangle a volání OnPaint ve druhém pořadí - vaše grafika může být překreslena výchozí grafikou.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za rady, Paint samozřejme funguje, ale já nechápu proč se to nevykreslí, když to dám třeba do konstruktoru a použiju.

this.CreateGraphics();
//nebo
Graphics g = Graphics.FromHwnd(this.Handle);

Dříve to fungovalo a Tomáš Herceg v tutoriálu programujeme hry v GDI+ použil také a fungovalo to.

PS: Zkoušel jsem to i bez Dispose(), ale pořád nic...

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

To je tak, ve Windows Forms je věc zvaná Message Queue a funguje to tak, že okno přijímá různé zprávy od systému, které ve smyčce zvané Message Loop vyhodnocuje. Pokaždé, když přijde zpráva WM_PAINT, okno překreslí sebe sama a stejnou zprávu pošle i komponentám, které na sobě má. Nyní, při tomto procesu vykreslování se vytváří nový Graphics objekt, takže veškerý obsah, který máte na svoučasném Graphics se ztratí, daná instance Graphics se ztratí, vytvoří se nová a právě proto, aby jsme si mohl přikreslit co potřebujete se vyvolá metoda Paint, kde můžete přikreslit vlastní obsah s jistotou, že bude vykreslený jen vždy, kdy je potřeba, ani méně ani více. Kdekoliv jinde můžete sice do Graphics kreslit též, nicméně je pouze otázka času, kdy dojde k překreslení a vše co máte nakresleno bude nenávratně ztraceno.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Aha, děkuji za objasnění, už je mi to jasné :-)

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

V tom herním tutoriálu jsem nekreslil do okna, ale do bitmapy, a to můžete dělat kdykoliv.

Pokud kreslíte přímo do okna, tak to vykreslujte vždy v události Paint. Pokud něco vykreslíte třeba v Button_Click, nevydrží to tam dlouho, jakmile okno něčím překryjete, může dojít k invalidaci a to, co jste vykreslil, nakrásně zmizí, leda byste to v události Paint vykreslil znovu.

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