Mul on MDI formi johon lataan kuvan taustalle, miten olisi mahdollista skaalata kuva aina formin kokoiseksi, formi on aina koko ruudun kokoinen.
(Kristallipalloni kertoo VB6, joten siitä on oltava kysymys)
Mikään ei voisi olla helpompaa.
Laitat formille kaksi pictureboxia
Ekan nimeksi pTausta, Visible=False, Picture = haluamasi kuva
Toisen nimeksi pTemp, Visible=False, Autoredraw=True
Sitten seuraava koodi
Private Sub MDIForm_Resize() If Me.WindowState = vbMinimized Then Exit Sub pTemp.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight pTemp.PaintPicture pTausta.Picture, 0, 0, Me.ScaleWidth, Me.ScaleHeight Me.Picture = pTemp.Image End Sub
Ikkunan kokoa muutettaessa (eli kun se ei piirrä koko taustaa uudelleen) tuo toimii vähemmän optimaalisesti, mutta sanoitkin että sovelluksesi on koko ajan "full screen".
Tässä on vähän häksöröintiä enemmän, mutta toimii paremmin:
Option Explicit Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long Private m_ClientDC Private m_Kuva As IPictureDisp Private m_Koko As PictureBox Private Sub MDIForm_Load() Set m_Kuva = LoadPicture("C:\Windows\tausta_1024x600.bmp") Set m_Koko = Me.Controls.Add("VB.PictureBox", "m_Koko") m_ClientDC = GetDC(FindWindowEx(Me.hWnd, 0, "MDIClient", vbNullString)) End Sub Private Sub MDIForm_Resize() If Me.WindowState <> vbMinimized Then Timer1.Interval = 1 End Sub Private Sub Timer1_Timer() Dim sngHeight As Single, sngWidth As Single sngHeight = m_Koko.ScaleX(Me.ScaleHeight, vbTwips, vbPixels) sngWidth = m_Koko.ScaleY(Me.ScaleWidth, vbTwips, vbPixels) m_Kuva.Render m_ClientDC, _ 0, sngHeight - 1, sngWidth, -sngHeight, _ 0, 0, m_Kuva.Width, m_Kuva.Height, vbSrcCopy Timer1.Interval = 0 End Sub
Noin, nyt kun on taas enemmän aikaa kirjoittaa: tuo koodi siis kiertää piirtäessä timerillä sen ongelman, että Resize-eventin jälkeen tapahtuu vielä piirtämistä, joka pyyhkäisee sitten julmasti kuvan pois näkyvistä. Tosin yksi ongelma tässä jää: kuva ei pysy muistissa, eli sitä ei piirretä uudelleen kun pitäisi. Huomasin kuitenkin taustakuvan kanssa semmoisen oudon ongelman, että se ei päivity kuten sen pitäisi, kun kuvan pitäisi vaihtua. Vanha kuva jää kummittelemaan päälimmäiseksi, mikä hämää suuresti, eikä minulla ole nyt niin paljon aikaa että ehtisin selvittää mistä moinen johtuu. Joskus asiat osaavat olla kieroja...
Sitten yksi outo asia jonka huomasin oli se, että jos asetan oikeaoppisesti m_ClientDC:n Longiksi, niin kappas kummaa: tulee virheilmoitus, jota ei kaiken järjen mukaan pitäisi tulla! Joko tämä on VB:n bugi, joka johtuu vanhasta versiosta (en ole tainnut päivittää tätä SP6:ksi), tai sitten minulta on jäänyt jotakin huomaamatta.
Subclassaamalla saisi parhaimman toimivuuden, mutta sitten koodin määrä kasvaa jo ehkä hitusen liikaa ja lisäksi tulee kaatumisvaara IDE:n alla.
Nämä töissä kirjoitetut pätkät ovat aina yhtä kivoja...
Aihe on jo aika vanha, joten et voi enää vastata siihen.