Hei.
Tarkoituksenani olisi tehdä VB5:llä seuraavaa.
Picture-komponenttiin ladataan niin iso kuva, että se ei mahdu sinne kokonaan.
Edelleen nyt kuvaa voisi vierittää esiin ScrollBar-komponenteilla.
Ajatuksenani on, että kuva ladattaisiin ensin kokonaan StdPictureen,
mistä se kopioitaisiin osina esiin Picture-komponenttiin, kun
ScrollBareja klikkaillaan.
Miten tällainen kopiointi (siis vain kuvan kopiointi suorakulmiona) tehdään? Onko toisaalta lähestymistapani kokonaan virheellinen?
Minun ehdotukseni on sijoittaa halutun kokoisen kuvakehyksen (PictureBox) sisään toinen kuvakehys, johon varsinainen kuva ladataan ja joka muuttuu ladatun kuvan kokoiseksi (AutoSize = True). Kun kuvakehykset ovat sisäkkäin, käyttäjälle näkyy kuitenkin vain se osa kuvasta, joka on uloimman kuvakehyksen alueella.
Kun kuvakehyksen sivuille laitetaan vierityspalkit, niille voidaan laskea raja-arvot seuraavasti:
HScroll1.Min = 0 HScroll1.Max = pKuva.Width - pTausta.Width VScroll1.Min = 0 VScroll1.Max = pKuva.Height - pTausta.Height
Tässä pTausta on ulompi kuvakehys ja pKuva sisempi kuvakehys. Tässä on oletettu, että ikkunan ja kuvakehysten mittayksiköt ovat samat (minä käytän mieluiten pikseleitä, jolloin ScaleMode = 3).
Tämän jälkeen vierityspalkit saa toimimaan seuraavalla koodilla:
Private Sub HScroll1_Change() pKuva.Left = -HScroll1.Value End Sub Private Sub HScroll1_Scroll() pKuva.Left = -HScroll1.Value End Sub Private Sub VScroll1_Change() pKuva.Top = -VScroll1.Value End Sub Private Sub VScroll1_Scroll() pKuva.Top = -VScroll1.Value End Sub
Ajatuksena on siis, että vaakasuuntainen vierityspalkki määrittää, kuinka paljon sisempää kuvakehystä siirretään vasemmalle ja pystysuuntainen vierityspalkki määrittää, kuinka paljon sisempää kuvakehystä siirretään ylös. Käyttäjälle näkyy aina uloimman kuvakehyksen vasemmasta ylänurkasta alkava osa kuvasta. Sama koodi täytyy kirjoittaa kahteen kohtaan, koska vierityspalkin arvo voi muuttua kahdella tavalla.
Sinunkin menetelmäsi lienee toimiva, vaikka en sitä nyt kokeillut. Kuvan osia voi kopioida kuvakehyksestä toiseen joko VB:n omalla PaintPicture-metodilla tai WinAPIin kuuluvalla BitBlt-funktiolla. Jos kopiointi ei meinaa onnistua, kannattaa kokeilla vaihtaa kuvakehysten AutoRedraw-ominaisuuden arvoa. Tässä tapauksessa koko kuvan voisi ladata ikkunan ulkopuolelle siirrettyyn kuvakehykseen, josta voi sitten kopioida pienempiä osia käyttäjälle näkyvään kuvakehykseen.
Kiitoksia oikein paljon! Sinun ratkaisusi tuntuu paremmalta.
En vain saa sitä toimimaan.
Jos sijoitan kaksi samankokoista PictureBoxia päällekkäin
ja lataan alla olevalle kehykselle kuvan, ei näy mitään, jos
lataan sen päälle olevalle kehykselle kun AutoSize = True,
niin kuva venyy ikkunan rajoille asti ScrollBarien päälle.
Voitko antaa vielä ihan perus aloittelijalle sopivan luurankoesityksen
koodeineen, miten tämä tulisi tehdä? Kiitoksia jo etukäteen!
markus_j kirjoitti:
Jos sijoitan kaksi samankokoista PictureBoxia päällekkäin
Ne ei pidä olla päällekäin, vaan sen toisen (AutoSize = true) pitää olla sen toisen sisällä.
Hmmm, tunnen itseni vieläkin enemmän aloittelijaksi. :-) Joudun näin perjantai iltana vielä kysymään, ottamatta kantaa juotujen mietojen keskiolueiden määrään, mitä tarkoittaa nyt sisällä, jos ei päällekkäin. Tunnen itseni Homer Simpsoniksi... :-)
Kun piirrät toisen kuvakehyksen ensimmäisen sisään, aloita piirtäminen ensimmäisen kuvakehyksen sisältä (eli paina hiiri alas ensimmäisen kuvakehyksen sisällä). Tätä on hieman vaikea selittää, mutta kokeilemalla onnistut aika varmasti. :)
Tuossa on esimerkki VB5-muodossa:
Kiitoksia! Sain toimimaan! Jos vielä ilmenee ongelmia kysyn myöhemmin.
Teen BlitzBasic3D:llä peliä, johon teen työkaluohjelmaa VB5:llä.
On päässyt kulumaan jo tovi, kun viimeksi tein mitään VB5:llä.
Mutta, kuten sanottua, kiitoksia paljon! En olisi tuota itse saanut toimimaan,
ainakaan pienellä aikavälillä, uskon. :-)
Hmmm. Vielä se, että saa scrollattua kuvan ScrollBareilla juuri PictureBoxin reunaan asti. Näyttää siltä, että ScaleWidth ja ScaleHeight -propertyt pKuva:ssa ja pTausta:ssa olisivat ratkaisut. Kysyisin vielä, että miten nuo arvot lasketaan tai mistä ne tulevat, että voin itse laskea. Kiitoksia!
PS.
Sain uuden PictureBoxin aiemman sisään seuraavasti (VB5):
Ensin klikataan normaalisti (vasemmasta reunasta) ToolBoxista PictureBox. Sitten seuraava hiiren oikea nappi pohjassa ToolBoxissa PictureBoxin kohdalla ja valitaan Hide, jolloin vasemmassa
reunassa olevat komponentit (ToolBox) häviävät, mutta toisen
PictureBoxin saa aiemman sisään.
Itseäni hämmensi tämä, että koko ToolBox joudutaan näemmä hävittämään, jotta saa toisen PictureBoxin toisen sisään (Hide).
Muuta en itse keksinyt.
Ei todellakaan tarvi ToolBoxia piilottaa saadaksesi kuvaboxin sisään muita kontrolleja. Itse asiassa kuvaboxi toimii kuten formikin eli voit piirtää sen sisään muita kontrolleja rajatta. On vain huomattava, että kuvaboxi tulee olla valittuna kun piirrät jotain sen sisään. Siis kuvaboxin kehyksissä täytyy näkyä valintakahvat, joista sitä voi venytellä. Muutoin piirrettävä kontrolli menee formille. Frame (kehys) on toinen kontrolli, jonka sisään voi piirtää muita kontrolleja. Voit helposti tarkistaa, onko piierretty kontrolli toisen sisällä vai ei siirtämällä sitä formilla toiseen paikkaan. Sisällä olevat kontrollit siirtyvät mukana.
Noita Scalemodeja ei tarvi laskea mitenkään kun käytät Antin ohjeen mukaan arvoa 3 eli pixel kaikissa, formilla ja ainakin kuvaboxilla pTausta.
Kyllä, setä on oikeassa. Testiohjelmassani latasin erikseen ajonaikana kuvan, enkä käyttänyt Form/Load-koodia ladatulle kuvalle, jotta max-arvo olisi laskettu oikein. Kokeilin upottaa suoraan bitmapin ohjelmaan ja kaikki sujui niinkuin pitääkin.
Kiitoksia kaikille!
Aihe on jo aika vanha, joten et voi enää vastata siihen.