Ok, anche se ho dubbi sulle misure che il cliente ti ha fornito.
Comunque la soluzione c'è. Non puoi utilizzare PrintForm, perchè questo invia direttamente i dati alla stampante senza attendere e non avresti modo di stampare altri form sullo stesso modulo. Puoi però costruirti l'immagine con l'oggetto printer in 2 modi:
1) Costruisci l'etichetta da zero (te lo consiglio)
2) Ti memorizzi il form + volte e lo mandi in stampa.
Non posso dirti come fare il caso n1, perchè non so quello che c'è nel form, ma ti assicuro che è molto + facile ed elegante come metodo.
Per il caso 2 fai così...
In un modulo scrivi questo:
codice:
Public Declare Function BitBlt Lib "gdi32" _
(ByVal hDCDest as Long, ByVal XDest as Long, _
ByVal YDest as Long, ByVal nWidth as Long, _
ByVal nHeight as Long, ByVal hDCSrc as Long, _
ByVal XSrc as Long, ByVal YSrc as Long, _
ByVal dwRop as Long) As Long
Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Nel form inserisci una PictureBox facendo in modo che non si veda (o la rendi non visibile o la sposti in modo che esca dalle dimensioni del form) ed inserisci questo codice (nel codice del form da stampare) che ti permette di riempire la PictureBox con l'immagine del form.
codice:
Private Sub PrintXForm()
Dim r As Long
Dim hWndForm As Long
Dim hDCForm As Long
Dim LeftForm As Long
Dim TopForm As Long
Dim WidthForm As Long
Dim HeightForm As Long
LeftForm = 0
TopForm = 0
WidthForm = Me.ScaleX(Me.Width, vbTwips, vbPixels)
HeightForm = Me.ScaleY(Me.Height, vbTwips, vbPixels)
hWndForm = Me.hWnd
hDCForm = GetWindowDC(hWndForm)
r = BitBlt(Picture1.hdc, 0, 0, WidthForm, HeightForm, _
hDCForm, LeftForm, TopForm, vbSrcCopy)
r = ReleaseDC(hWndForm, hDCForm)
End Sub
In questo momento la PictureBox contiene l'immagine di un form, ovvero di un'etichetta. Non so se le etichette sono sempre uguali, o se c'è una variabile nel form. Se c'è una variabile devi far ripetere la Sub PrintXForm + volte. Per semplificare poniamo che l'etichetta sia sempre uguale e che sia posizionata a 12 mm dal bordo sinistro e la prima a 4 mm dall'alto.
Ora posiziona l'etichetta sul modulo
codice:
Private Sub CreateSheet
Dim Counter as Long
PrintXForm()
Printer.ScaleMode = 6 'mm
For Counter = 1 to MaxCounter
PrintLabel Cunter
Next
Printer.EndDoc
End Sub
Private Sub PrintLabel(IndexLabel as Long)
OffsetY = 4 'public
Printer.CurrentX = 12
Printer.CurrentY = (IndexLabel mod 8 - 1) * 77 + OffsetY
Printer.PaintPicture (Picture1.Picture, Printer.CurrentX, Printer.CurrentY)
If IndexLabel mod 8 = 0 Then
Printer.NewPage()
EndIf
End Sub
Se invece il form è variabile sposta PrintXForm nel ciclo for
codice:
Private Sub CreateSheet
Dim Counter as Long
Printer.ScaleMode = 6 'mm
For Counter = 1 to MaxCounter
ModificaForm()
PrintXForm()
PrintLabel Cunter
Next
Printer.EndDoc
End Sub
Ribadisco che il primo metodo è meglio!