Det her er helt klart en af de udfordringer mange udviklere ville forsøge at kode på en meget mere besværlig måde, end det behøver at være. Sådan som jeg har gjort det, tager FillBackground funktionen to parametrer.
BgObj er det objekt du vil dække hele baggrunden med - overvej at bruge
Image frem for
PictureBox, da den fylder mindre i hukommelsen.
Mem() er et todimensionelt array, der husker hvilke steder der allerede er blevet dækket af objektet, så hele baggrunden bliver dækket på en sikker måde, uden chance for hverken huller eller overlapninger.
Den der
Static Mem(100, 100) kunne også være placeret inden i
sub'en, men så ville det ikke være muligt at genbruge funktionen til at udfylde andre baggrunde. Af samme grund står der
BgObj(0).Container istedet for
Form1 eller
Me.
Hvis du vil se nærmere på hvordan funktionen virker, kan jeg anbefale at du sætter funktionskaldet ind under et knappetryk istedet for i
Form_Resize hvor den er nu, så du kan se den reagere. Du kan også smide en
MsgBox ind.
Option Explicit
Private Sub Form_Resize()
Static Mem(100, 100) As Boolean
FillBackground Shape1, Mem
End Sub
Public Sub FillBackground(BgObj As Object, ByRef Mem() As Boolean)
With BgObj(0)
Dim CurX As Integer
Dim CurY As Integer
For CurX = 0 To Int(.Container.ScaleWidth / .Width)
For CurY = 0 To Int(.Container.ScaleHeight / .Height)
If Mem(CurX, CurY) = False Then
'Copy the object, set the position, show
Load BgObj(BgObj.UBound + 1)
BgObj(BgObj.UBound).Move CurX * .Width, CurY * .Height
BgObj(BgObj.UBound).Visible = True
'Set the memory function
Mem(CurX, CurY) = True
End If
Next CurY
Next CurX
End With
End Sub