Průhlednoast v PictureBoxu   zodpovězená otázka

VB.NET, WinForms

Možná je to banalita, ale nemůžu na to přijít...

Mám na formu picturebox, v něm obrázek (formát jpg), označme ho třeb PB1. Nad ním mám druhý picturebox (PB2), v něm je něco jako nitkový kříž ve formátu png, tedy s průhledným pozadím.

Když je PB2 někde na formuláři, průhledné pozadí funguje, ale když umístím PB2 nad PB1, průhlednost jakoby zmizí a pozadí je bílé.

Lze to někde nastavit, aby PB2 byl nad PB1 průhledný tam kde má? Nemůžu přijít na to, který parametr to ovlivňujem, pokud nějaký.

Děkuji

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

Ovládací prvky ve Windows Forms se vždy budou překrývat nehledě na jejich obsah.

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

To jsem intuitivně tušil taky, jenže co s tím...? Existuje nějaký řešený příklad se dvěma pictureboxy...?

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

Čert vem průhlednost :-)

Programově vytvořím 3 pictureboxy nad podkladovým pictureboxem. Ale když je chci zase smazat, ať dělám co dělám, pořád tam jsou vidět. Poradí prosím někdo kde je chyba?

 pocitadlo = pocitadlo + 1
        'pokud je jich méně jak 3, tak tvoříme nové
        If pocitadlo <= 3 Then
            nkriz(pocitadlo) = New PictureBox()
            nkriz(pocitadlo).Image = kr
            nkriz(pocitadlo).Location = New Point(PB1.Location.X + e.X - 8, PB1.Location.Y + e.Y - 8)
            nkriz(pocitadlo).SizeMode = PictureBoxSizeMode.AutoSize
            nkriz(pocitadlo).Name = "kriz" & pocitadlo
            Me.Controls.Add(nkriz(pocitadlo))
            nkriz(pocitadlo).BringToFront()

            souradniceX(pocitadlo) = e.X : souradniceY(pocitadlo) = e.Y
            '   kriz.Location = New Point(GroupBox1.Location.X + e.X + 2, GroupBox1.Location.Y + e.Y + 11)
            '   kriz.Visible = True
        Else
            '  Počítáme
            For i = 1 To 3
                Me.Controls.Remove(nkriz(i))
            Next i
            PB1.Image = zaloha 'vrátím do pictureboxu původní obrázek (uložený do "zaloha" hned při běhu programu
            PB1.Invalidate() 'pokus o refresh?
        End If

třikrát kliknu, pokaždé na daných souřadnicích vytvoří novou instanci pictureboxu. Ale když je klik>3, tak by mělo běžet to co je v Else, ale ve výsledku jsou ty tři nové pictureboxy pořád viditelné...

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

Kreslit to ručně přímo na ovládací prvek. Nemusí to být zrovna Form ani PictureBox, ale pro menší náročnost na systémové prostředky např. obyčejný Panel. Příklad uveden níže.

Pokud to v projektu bude použito vícekrát, vytvořil bych k tomu účelu Custom Control.

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

Pokud byste obrázky kreslil přímo na formulář bez kontrolů PictureBox, tak pak je možné nakreslit více obrázků přes sebe a průhlednost bude zachovaná.

Kód na vykreslení jednoho obrázku je následující:

Dim Image As Image = ImageList1.Images(0)   'Get Image
        Dim g As Graphics = Me.CreateGraphics()
        g.DrawImage(Image, 100, 100, Image.Width, Image.Height)
        g.Dispose()
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za náměty. Jak to bude, když bych měl na formuláři groupbox a na něm jsem vytvářel grafiku (viz předchozí ukázka), půjde to?

Dále předpokldám, že prvek "g" viz předchozí příklad půjde indexovat, abych měl kontrolu nad každým obrázkem...?

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

CreateGraphics má snad každý ovládací prvek a samozřejmě je možné jeho návratovou hodnotu uložit kamkoliv (do pole). Uvědomte si ale, že je potřeba vždy při požadavku na překreslení (událost Paint příslušného ovládacího prvku) znovu překreslit celou plochu nebo ideálně jen potřebnou část. Tudíž se zvyšujícím se počtem ploch k překreslení (Graphics) roste náročnost. Ještě se mi nestalo, že bych v rámci jednoho formuláře potřeboval víc než jeden Graphics.

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