Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Nacrtano na formi nestaje. Kako da ostane?

[es] :: .NET :: Nacrtano na formi nestaje. Kako da ostane?

[ Pregleda: 2800 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Hyperborejac
Kotor

Član broj: 9988
Poruke: 56
*.crnagora.net.



+1 Profil

icon Nacrtano na formi nestaje. Kako da ostane?18.01.2006. u 21:59 - pre 222 meseci
Jednu stvar nikako da uradim u VB.NET-u. Naime, pretpostavimo da nesto crtam po formi (krugove, elipse i slicno). Nakon toga minimizujem formu i ponovo je aktiviram iz taskbara. Sve sto sam crtao nestane. Pitanje je : Kako da ostane, a da se ne iscrtava ponovo (ovo je jako vazan uslov).

Najvise bi mi odgovaralo resenje kada bi mogao da sacuvam izgled ekrana u bitmapu (pravougaonik, sliku) oblika me.location.x, me.location.y, me.width, me.height, i nakon vracanja prosto 'nalijepim' tu bitmapu preko forme (preko me.backgroundImage, npr.). Da li je ovo moguce uraditi i kako?


Milivojev pas je siledžija. Siledžija!
 
Odgovor na temu

kovach
Srdjan Kovacic
Beograd

Član broj: 17057
Poruke: 157
*.dialup.sezampro.yu.

Jabber: kovach@elitesecurity.org


+1 Profil

icon Re: Nacrtano na formi nestaje. Kako da ostane?19.01.2006. u 01:51 - pre 222 meseci

Moguce je uraditi... uz naravno malo volje... :)

Pre svega reci da li koristis naredbu Application.DoEvents() jer je ovo o cemu ti govoris veoma karakteristicno kao jedan od njenih sporednih efekata pogotovo ako se ne upotrebi na pravi nacin a neretko cak i kada je pravlino iskoriscena...

Druga stvar.... ti kada odradis to o cemu govoris i stavis sliku kao background image najverovatnije ce ti ona ostati iza svih ostalih objekata na formi tipa dugmad i slicne stvari... mozda toga na tvojoj formi nema pa ti nece biti problem... ne znam... pitam...

Ja sam isti problem resio na slican nacin ali nisam crtao direktno na formu nego u PictureBox pa sam onda tu snimljenu sliku u jpg formatu stavljao kao njegov image... dakle "picturebox1.image=image.fromfile(path)" (ili tako nesto... proslo je dosta vremena)... ovim dobijas to da ti iscrtane "slike" uvek budu na istom delu forme i tako znas kako da organisujes ostale objekte... dakle imas bukvalno polje za crtanje umesto da crtas na celoj formi... u principu ako su ti dimenzije bitne ti mozes da stavis da ti taj PictureBox prekriva bukvalno celu formu, no opet ti je tako bolje jer danas-sutra kada se setis da ti treba jos jedno dugme ladno "razvuces formu jos malo i nista ti se ne menja, odnosno polje za crtanje ti je nezavisno od ostatka forme... ali ako ti zelis tako ili ti program nalaze da to tako radis moze i to... mislim nije nikakav problem...

E sad sliku mozes da dobijes tako sto uhvatis screenshot cele forme a zatim bukvalno "iseces" to polje koje hoces da sacuvas kao sliku...
Ja sam radio tako da tu uhvacenu sliku cele forme fizicki sacuvam na disk jer mi je trebala i ona, a da li moze direktno bez cuvanja u jpg formatu zaista ne znam, ali ne sumnjam da moze uz minimalne izmene...

Ako te interesuje ista od ovoga odnosno ako sam dobro razumeo tvoju pitanje reci mi pa cu da prekopam malo ove programcice da ti to okacim ovde...
Kovach
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: Nacrtano na formi nestaje. Kako da ostane?19.01.2006. u 06:34 - pre 222 meseci
Daj to parce koda koje iscrtava po formi. Mislim da znam kako mozes jednostavo da uradis to kako treba, ali bi trebalo prvo videti kod koji si uradio.
 
Odgovor na temu

Hyperborejac
Kotor

Član broj: 9988
Poruke: 56
*.crnagora.net.



+1 Profil

icon Re: Nacrtano na formi nestaje. Kako da ostane?19.01.2006. u 12:24 - pre 222 meseci
Evo stize kod, doduse osakacen i jako kratak. Izdvojio sam srz problema u poseban program i njega (neocekivano) nazvao "Srz Problema". Master Mind nisam htio da postujem, jer ima 500kb, a i nije najpregledniji, pa je mozda ovako najbolje za ljude koji zele da pomognu.

Inace sam napisao MM koji radi korektno, ali koji ima tri tone kvadratica koji se vazda nanovo iscrtavaju pri resize-u forme, sto smatram skandalozno losim resenjem (kojeg se stidim). Hvala za trud i pozdrav.



[Ovu poruku je menjao Hyperborejac dana 19.01.2006. u 13:31 GMT+1]
Milivojev pas je siledžija. Siledžija!
Prikačeni fajlovi
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: Nacrtano na formi nestaje. Kako da ostane?19.01.2006. u 12:39 - pre 222 meseci
Uh, nemam VS ovde. Koliko vidim iz Notepad-a, ovo je sav kod (osim generisanog).
Code:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        pctSlika.Image() = pctSlika.Image.FromFile(CurDir() & "\crvena.jpg")

    End Sub

    Private Sub bttnIzlaz_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnIzlaz.Click
        Me.Close()
    End Sub


    Private Sub bttnSpusti_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnSpusti.Click
        Dim bmp As Bitmap
        Dim tacka As Point
        bmp = New Bitmap(Me.Width, Me.Height)
        Me.BackgroundImage = bmp
        tacka.Y = pctSlika.Location.Y + 40
        tacka.X = pctSlika.Location.X
        If (tacka.Y > 480) Then
            bttnSpusti.Enabled = False
        Else
            pctSlika.Location = tacka
        End If
    End Sub


A koliko vidim, ovde nema nikakvog crtanja vec samo pomeranje pctSlika po vertikali prilikom klika na taster bttnSpusti.
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.fiberop.matgnet.com.

Sajt: www.mika.rs


+6 Profil

icon Re: Nacrtano na formi nestaje. Kako da ostane?19.01.2006. u 13:13 - pre 222 meseci
A sto ne iscrtas sve ponovo na OnPaint eventu ? Formu mozes da stavis u backbuffer.
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

Hyperborejac
Kotor

Član broj: 9988
Poruke: 56
*.crnagora.net.



+1 Profil

icon Re: Nacrtano na formi nestaje. Kako da ostane?19.01.2006. u 14:53 - pre 222 meseci
Citat:
A koliko vidim, ovde nema nikakvog crtanja vec samo pomeranje pctSlika po vertikali prilikom klika na taster bttnSpusti.


Kad ga budes startovao, bice ti jasno u cemu je problem. Dakle, kad se pctSlika pomjeri po vertikali, njena kopija gore ostaje, jer citavu formu cuvam kao bitmapu. Svakim klikom, bitmapu podesim kao pozadinu i spustim pctSliku... i tako stalno. To tako i treba da radi, problem je sto se nakon minimizovanja i ponovnog aktiviranja programa, sve te prosle kopije se izgube, dok konacna pctSlika, naravno, ostaje. Dakle, meni treba DA SVE OSTANU, sto i jeste slucaj dok se ne uradi minimizacija. Uzgred, ovo jeste citav kod i tacno, nema crtanja, jer sam htio da bude sto kraci (a ako se rijesi za ovaj slucaj, rijesio se i za sve ostale).

Citat:
A sto ne iscrtas sve ponovo na OnPaint eventu? Formu mozes da stavis u backbuffer.


Stavljanje forme u backbuffer i jeste problem, kao sto se vidi iz koda. Po mojoj logici, minimize ne bi smio da ista mijenja prosto zato sto, u kodu, ja vec formu cuvam kao bitmapu. Uostalom kod je tu, i svako resenje koje ne uvodi definisanje novih kontrola prihvatam oberucke. Pozdrav i hvala.
Milivojev pas je siledžija. Siledžija!
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.fiberop.matgnet.com.

Sajt: www.mika.rs


+6 Profil

icon Re: Nacrtano na formi nestaje. Kako da ostane?20.01.2006. u 08:31 - pre 222 meseci
Citat:
Stavljanje forme u backbuffer i jeste problem, kao sto se vidi iz koda


Kog koda
Ako ides na varijantu da koristis nekakav backbuffer, moraces da koristis Win32 API jer u .Net nemas pristupa device contextu prozora jer su unmanaged objekti.
Sa CreateCompatibleDC napravis kopiju DC-a tvog prozora i napravis kompatibilni bitmap (mislim da se bash zove CreateCompatibleBitmap) koji je u stvari bafer i selektujes ga u tu kopiju DC-a preko SelectObject funkcije.
BitBlt funkcijom prebacujes sadrzaj iz jednog DC-a u drugi, i na zatvaranju aplikacije moras da pozoves DeleteObject da bi oslobodio resurs bitmape i potom DeleteDC za oslobadanje DC-a, sto mozes iz Dispose() metode.

Ovo pricam napamet, davno je bilo kada sam ovako nesto radio, ali generalno to je to.
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

Hyperborejac
Kotor

Član broj: 9988
Poruke: 56
*.crnagora.net.



+1 Profil

icon Re: Nacrtano na formi nestaje. Kako da ostane?20.01.2006. u 10:41 - pre 222 meseci
Citat:
Kog koda


Ovog sto je dat iznad kao attachment (Srz Problema.rar). Uzgred, znam idejno kako ovo treba da se uradi, ali ne znam da napisem. Tebi hvala, ali malo sam sta shvatio iz tvog posta. Inace, ovo me zanima trenutno samo iz radoznalosti, jer sam napisao verziju koja sve ponovo iscrtava na formu (tj. ucitava .jpg slike u nic PictureBox-ova), ali, jednostavno receno, to je lose resenje i sigurno postoji bolji nacin. Pozdrav.
Milivojev pas je siledžija. Siledžija!
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: Nacrtano na formi nestaje. Kako da ostane?20.01.2006. u 11:30 - pre 222 meseci
Mislim da radis po kompletno pogresnom principu. Zasto ne bi crtao koristeci Graphics objekat? Imas lepo metodu DrawBitmap kojom mozes iscrtati jedan bitmap preko drugog.
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
212.200.27.*



+311 Profil

icon Re: Nacrtano na formi nestaje. Kako da ostane?20.01.2006. u 13:05 - pre 222 meseci
Hyperborejac:
Citat:

Kad ga budes startovao, bice ti jasno u cemu je problem. Dakle, kad se pctSlika pomjeri po vertikali, njena kopija gore ostaje, jer citavu formu cuvam kao bitmapu. Svakim klikom, bitmapu podesim kao pozadinu i spustim pctSliku... i tako stalno. To tako i treba da radi, problem je sto se nakon minimizovanja i ponovnog aktiviranja programa, sve te prosle kopije se izgube, dok konacna pctSlika, naravno, ostaje. Dakle, meni treba DA SVE OSTANU, sto i jeste slucaj dok se ne uradi minimizacija. Uzgred, ovo jeste citav kod i tacno, nema crtanja, jer sam htio da bude sto kraci (a ako se rijesi za ovaj slucaj, rijesio se i za sve ostale).


Code:

Private Sub bttnSpusti_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnSpusti.Click
        Dim bmp As Bitmap
        Dim tacka As Point
        bmp = New Bitmap(Me.Width, Me.Height)
        Me.BackgroundImage = bmp
        tacka.Y = pctSlika.Location.Y + 40
        tacka.X = pctSlika.Location.X
        If (tacka.Y > 480) Then
            bttnSpusti.Enabled = False
        Else
            pctSlika.Location = tacka
        End If
    End Sub


Ti ovde kreiraš bitmapu koja je po default-u transparentna i kad je staviš kao pozadinu forme ona sprečava crtanje pozadine forme (u stvari nikakvo iscrtavanje ove bitmape se ne dešava) tako da ti ostaje iscrtan picture box na prethodnoj poziciji - ovaj kod radi tačno ono što je i napisano, kad se forma minimizuje i ponovo prikaže onda je ona potpuno transparentna i prikazuje ono što je u pozadini. Ovaj tvoj pristup je vrlo čudan i u neku ruku pogrešan.
Evo ovde ti postujem kod koji radi ono što tebi treba samo obriši picture box sa forme i pokreni.

Code:

    Private RedSquareLocation As Point
    Private RedSquare As Bitmap

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim BackgroundBitmap As Bitmap
        RedSquareLocation = New Point(16, -24)
        RedSquare = Image.FromFile(CurDir() & "\crvena.jpg")
        BackgroundBitmap = New Bitmap(Me.Width, Me.Height)
        Me.BackgroundImage = BackgroundBitmap
        Graphics.FromImage(Me.BackgroundImage).Clear(Me.BackColor)
        MoveDown()
    End Sub

    Private Sub bttnIzlaz_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnIzlaz.Click
        Me.Close()
    End Sub

    Private Sub bttnSpusti_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnSpusti.Click
        MoveDown()
    End Sub

    Private Sub MoveDown()
        Dim TempPoint As Point
        TempPoint.Y = RedSquareLocation.Y + 40
        TempPoint.X = RedSquareLocation.X
        If (TempPoint.Y > 480) Then
            bttnSpusti.Enabled = False
        Else
            Graphics.FromImage(Me.BackgroundImage).DrawImage(RedSquare, New Rectangle(TempPoint.X, TempPoint.Y, 32, 32))
            RedSquareLocation = TempPoint
            Me.Refresh()
        End If
    End Sub
 
Odgovor na temu

Hyperborejac
Kotor

Član broj: 9988
Poruke: 56
*.crnagora.net.



+1 Profil

icon Re: Nacrtano na formi nestaje. Kako da ostane?20.01.2006. u 16:20 - pre 222 meseci
Sta da kazem osim hvala, u potpunosti ste mi rijesili problem, i objasnili ga stvarno kako treba. Pozdrav svima koji su postovali i sve najbolje.


Milivojev pas je siledžija. Siledžija!
 
Odgovor na temu

[es] :: .NET :: Nacrtano na formi nestaje. Kako da ostane?

[ Pregleda: 2800 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.