Thanks all, works beautifully now. The final method (which incorporates most of the advice here) for future reference:
add the properties pic as picture, picWidth as integer, picHeight as integer to the window
set up the picWidth and picHeight as you to your requirements
(in my case the width is the length of the item I want to show times the zoom factor plus some padding left and right)
Add a method DrawToPicture to the window
[code]dim p as New Picture( picWidth + 20, picHeight, 32)
pic = p
dim g as Graphics = pic.Graphics
// don’t forget to set the scrollbars for the new values
HScrollbar.Maximum = picWidth - canvas1.Width + 20
VScrollBar.Maximum = picHeight -canvas1.Height + 20
g.draw Whatever
[/code]
In the canvas paint event simple do
[code]g.ForeColor = &cFFFFFF
g.FillRect( 0, 0, g.Width - 1, g.Height - 1 )
// otherwise if the picture is smaller than the canvas
//then part of the canvas has a grey instead of a white background
If pic <> Nil Then
g.DrawPicture(pic, HScrollBar.Value * -1, VScrollbar.Value * -1)
End If[/code]
The code in the scrollbar ValueChanged event is simply
canProteinPrint.Invalidate
To copy the WHOLE graphics and not just the part shown in the canvas I use
dim c as new Clipboard
c.Picture = pic
c.Close
Hope I got all the relevant bits