Nefunkční metoda paint v třídě   otázka

VB.NET

Zde jsem si napsal třídu Tvary pro vykreslování tvarů do pictureboxů.

 Dim g As Graphics = Form1.PictureBox1.CreateGraphics
    Sub vykreslit()
        AddHandler Form1.PictureBox1.Paint, AddressOf paint
    End Sub

    Sub paint()
        Dim img As New Bitmap("txd.png")
        g.DrawImage(img, 50, 50)
        Form1.PictureBox1.Refresh()
    End Sub

Když v události Load zavolám metodu vykreslit

Dim neco As New tvary
neco.vykreslit()

tak se nic nevykreslí. Nevíte někdo co s tim?

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

1)v procedúre vykreslit síce pridávate procedúru paint ako handler události Paint, avšak táto udalosť je vyvolaná len, ak Windows požiada PictureBox1, aby sa prekreslil, prípadne ak na ňom zavoláte Invalidate

2)Váš kód mi smrdí zlým OOP návrhom. Ja by som to riešil tak, že vytvorím vlastnú triedu dediacu z System.Windows.Forms.Control, a potom štruktúru, ktorá by niesla všetky informácie potrebné na vykreslenie daného tvaru(okrem Graphics objektu). Do toho controlu dám kolekciu/pole danej štruktúry, a vykresľujem v handleri na udalosť Paint. Ak to je nutné, môžete na koniec handlera .Paint dať volanie Me.Invalidate(), potom však nastavte DoubleBuffered na True.

A taktiež Graphics objekt dostanete v parametri e.Graphics v handleri na Paint, nevytvárajte si nový cez CreateGraphics.

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

A ešte niečo. Mali by ste porozmýšľať, či by sa nedalo tie Bitmapy cacheovať, tzn. načítať vopred do poľa/kolekcie/slovníka, a nevytvárať pokaždé novú inštanciu triedy Bitmap, ibaže by to bolo fakt nutné.

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

Dobře díky za odpověd.

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

Už se mi to vykreslí ale pouze když okno maximalizuji. Jak to mám udělat aby se to vykreslilo už při načtení aplikace. Předem se omlouvám se začátečník.

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

Najjednoduchšie bude do události, kde sa to má prekresliť, dať volanie Me.Invalidate(), to zabezpečí vyvolanie události Paint aj so správnymi parametrami. Prípadne, v niektorých prípadoch je vhodnejšie dať volanie Invalidate na koniec handlera udalosti Paint, avšak potom je nutné nastaviť príslušnému controlu DoubleBuffered na True.

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