Ongelma on seuraavanlainen. Piirrään PictureBoxiin kuvan grafiikkakäskyillä. Sitten liikutan formia ruudun reunan yli. Kun tuon formin takaisin, se alue, joka meni ruudun reunan yli on jälleen päivittynyt PictureBoxin harmaalla taustalla. Miten piirretyn kuvan saisi säilymään tällaisissa tilanteista? Hokasin, että Auto Redraw auttaa, mutta siitä on joitain muita haittavaikutuksia, kuten se, että kun ohjelmallani piirtää (kyseessä on siis grafiikkaohjelma) niin hiirellä piiretty kuva ilmestyy vasta kun se on saanut ladattua kaikki pikselit, mitä hiiren vetämälle viivalle tulee. Ja nämähän eivät oikeastaan ole pelkkiä pikseleitä, joten lataamiseen menee aikaa. Vasta kun hiiren pystäyttää, eikä muistipuskuriin enää tule ladattavia pikseleitä, ne näkyvät kaikki. Joo... tosi kiva kun ymmäristte. :P
PictureBox.Refresh, kun haluat päivittää sen ruudun sisällön.
Tuo ei oikein auttanut. (Voisikohan mitenkään johtua siitä, että selitykseni ongelmastani meni päin
BEEP ' :D
Ongelma on siis siinä, että kun vien formin ruudun reunan yli ja tuon takaisin, niin PictureBoxiin piiretty kuva on muuttunut harmaaksi siltä alueelta, mikä kävi reunan ulkopuolella. Onko tähän yleensäkään mitään ratkaisua? Sama ongelma tulee myös, jos pienennän formin ruudun alalaitaan niin grafiikkakäskyillä piirretty kuva katoaa.
Ei, vaan AutoReDraw päälle, ja kun haluat päivittää grafiikat jotka kuvaan on vedelty niin kutsut Refresh, jolloin piirretty kuva jää pysyväksi. Itselläni ainakin toimii siten.
Btw mulla tulee joskus autoredrawia käyttäessä "Can't create autoredraw image" vaikka muistia olisikin jäljellä vaikka kuinka, mistä tämä voi johtua?
Muuten, tietääkö joku tarkkaan miten BitBlt-API-funktiota ja AutoReDraw:a pitäisi käyttää yhdessä?
Jahas, olen siis aivan toivoton selittäjä:
Ongelma on siis siinä, että Auto ReDrawia nimenomaan EI VOI käyttää, koska se päivittää kuvan vasta kun muistipuskuri on tyhjä. Muistipuskurilla tarkoitan siis sitä, että kun kone ei voi suorittaa kaikkea samalla hetkellä, niin seuraavat asiat menevät muistiin ja kone suorittaa ne heti kun saa edelliset valmiiksi. Jos jatkaa vain piirtämistä, ennen kuin edellinen piirto on saatu valmiiksi, niin kuva ei päivity piirron aikana ollekaan.
Mitä oikein tarkoitat muistipuskurilla? Ja voitko näyttää vähän koodiasi? Nimittäin ainakin tällainen koodi toimii ihan hyvin ja ilman viivettä, vaikka AutoRedraw olisi True.
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then Picture1.PSet (X, Y) End If End Sub
AutoRedrawin voi korvata kirjoittamalla Paint-tapahtumaan koodin, joka piirtää kuvan takaisin näkyviin silloin, kun ikkuna jälleen tulee näkyviin. Tämä voi tosin olla vaikea toteuttaa, jos kyseessä on käyttäjän tekemä piirros. Jos koodissa on aikaavievä silmukka, jonka aikana kuva ei päivity, DoEvents-komennon käyttäminen silmukan aikana pitäisi auttaa.
lainaus:
Muuten, tietääkö joku tarkkaan miten BitBlt-API-funktiota ja AutoReDraw:a pitäisi käyttää yhdessä?
Tämä on usein melkoista salatiedettä. Itse tapaan kokeilla eri vaihtoehtoja, kunnes kaikki toimii oikein. Mutta homma menee suunnilleen näin:
- jos kuvakehys, josta kopioidaan, on näkyvissä, voi AutoRedraw olla joko False tai True
- jos kuvakehys, josta kopioidaan, ei ole näkyvissä (ikkunan rajojen ulkopuolella), täytyy AutoRedraw olla True
- kuvakehyksen, johon kopioidaan, AutoRedraw täytyy olla False, jotta kuva tulee näkyviin
- kuvakehyksen, johon kopioidaan, AutoRedraw voi olla myös True, jolloin kuvaa voi kopioida edelleen, mutta se ei tule näkyviin (paitsi Refresh-metodia käyttämällä)
lainaus:
Muistipuskurilla tarkoitan siis sitä, että kun kone ei voi suorittaa kaikkea samalla hetkellä, niin seuraavat asiat menevät muistiin ja kone suorittaa ne heti kun saa edelliset valmiiksi.
Tuota meinaan muistipuskurilla. Ja kyllähän tuollainen yhden pisteen piirto toimii ilman viivettä. Uusi piste piirretään ohjelmassani aina, kun liikuttaa hiirtä, eikä käyttäjä voi millään liikuttaa hiirtä niin nopeasti, ettei kone pysyisi perässä. Mutta jos yksi hiirensiirto piirtääkin pelkän pisteen sijaan jonkin monimutkaisen kuvion (ohjelmassa on erilaisia työkaluja), piirtämiseen menee hetki aikaa. Tai no, ehkä on parempi, jos jätän koko homman ja käytän Auto ReDrawia. Ei se nyt niin kamalasti haittaa, vaikka kuva päivittyykin vasta, kun piirto-sub on loppunut. En vain olisi halunnut mitään kaksoispuskuroinnin tapaista vaikutusta. Pelkkä kuvan säilyminen formissa silloinkin, kun form ei näy, olisi riittänyt.
Edit: Toi lainausikkuna ei muutu siniseksi tuon uuden systeemin kanssa, missä pitäisi näkyä lainattavan tunnus. Tai sitten tein jotain väärin...
Aihe on jo aika vanha, joten et voi enää vastata siihen.