Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: MDI Form taustakuva

tesmu [10.07.2009 15:55:31]

#

Mul on MDI formi johon lataan kuvan taustalle, miten olisi mahdollista skaalata kuva aina formin kokoiseksi, formi on aina koko ruudun kokoinen.

Grez [10.07.2009 16:27:21]

#

(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".

Merri [16.07.2009 11:32:03]

#

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

Merri [16.07.2009 13:23:38]

#

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...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta