Image class
An Image is a windowless lightweight control for displaying a picture — a bitmap, JPEG, GIF, PNG, icon, cursor, or Windows metafile. It is the small, efficient alternative to PictureBox: no underlying Win32 window, no drawing surface, no child controls, no focus — just a rectangle on the parent that paints whatever is in Picture. Image controls are ideal for logos, decorative artwork, custom-drawn buttons, glyph rows, and any other place where a heavy PictureBox would be overkill.
The default property is Picture and the default event is Click.
Private Sub Form_Load()
Set imgLogo.Picture = LoadPicture(App.Path & "\logo.png")
imgLogo.Stretch = True
imgLogo.BorderStyle = vbFixedSingleBorder
End Sub
Private Sub imgLogo_Click()
MsgBox "Logo clicked"
End Sub
- Windowless rendering
- Stretch and auto-sizing
- Rotation
- Border
- Source-side and destination-side OLE drag-drop
- Data binding
- Properties
- Methods
- Events
Windowless rendering
An Image has no hWnd. The framework paints it directly onto its parent’s drawing surface during the parent’s paint cycle, so the control is much cheaper than a PictureBox and adds no Win32 window of its own. The trade-offs are the same as for any windowless control:
- No focus, no keyboard input, no
KeyDown/KeyPress/KeyUp/GotFocus/LostFocus/Validate. - No
hWndto pass to API functions, and noSetFocus. - Cannot host child controls.
For anything that needs those, use PictureBox instead.
Stretch and auto-sizing
Stretch is the master switch for sizing behaviour:
- Stretch = False (default): the picture is drawn at its natural pixel size and the Image auto-resizes itself to match every time a new Picture is assigned. The user may still resize the control manually — once that happens the picture is clipped or padded around the natural bounds (it is not re-stretched).
- Stretch = True: the picture is scaled to fill the Image’s rectangle. The resampling algorithm is chosen by StretchMode; aspect ratio is not preserved.
Metafiles (vbPicTypeMetafile, vbPicTypeEMetafile) are vector — they always scale to fit and the aspect ratio is preserved regardless of Stretch.
PictureDpiScaling, when True, multiplies the natural pixel dimensions by the current DPI scale factor before drawing — useful for keeping a logo the same physical size on a high-DPI monitor as on a 96-DPI one.
Rotation
Angle rotates the rendered picture, in degrees, anti-clockwise around the top-left corner of the control’s rectangle. 0 is the natural orientation; 90 is a quarter turn anti-clockwise; values between 0 and 360 give arbitrary rotations. The control’s bounding rectangle does not change — large rotation angles can therefore push the visible picture outside the rectangle. Hit-testing for Click, MouseDown, and the other mouse events still uses the unrotated rectangle.
Border
BorderStyle chooses between no border (the default) and a single sunken border drawn around the rectangle. When a border is present, Appearance selects between a 3-D and a flat (monochrome) version of it.
Source-side and destination-side OLE drag-drop
The Image control supports both ends of an OLE drag-drop operation:
- OLEDragMode controls the source side. With vbOLEDragAutomatic, holding the mouse over the Image and beginning a drag automatically picks up the current Picture into the resulting DataObject. With vbOLEDragManual (default) drags must be initiated by calling OLEDrag from a MouseDown handler.
- OLEDropMode controls the destination side. With vbOLEDropManual the OLEDragOver and OLEDragDrop events fire and the application decides what to do. vbOLEDropAutomatic is not supported on an Image and assigning it raises run-time error 5.
Data binding
Setting DataSource and DataField connects the Picture to a field of a Data control’s recordset. The bound field is read as binary picture data on each move; assigning Nothing to Picture writes a null-equivalent back to the recordset, and any other assignment serialises the picture’s bytes back through the bound field.
Properties
Anchors
The set of edges of the parent that the Image’s corresponding edges follow when the parent resizes. Read-only — assign individual .Left, .Top, .Right, .Bottom flags through the returned Anchors object.
Angle
The rotation of the rendered picture, in degrees, anti-clockwise around the top-left of the control’s rectangle. Double, default 0.
Appearance
The style of the border, as a member of AppearanceConstants: vbAppearFlat or vbAppear3d (default). Only meaningful when BorderStyle is vbFixedSingleBorder.
BorderStyle
The style of border drawn around the rectangle. A member of ControlBorderStyleConstants: vbNoBorder (0, default) or vbFixedSingleBorder (1).
Container
The control that hosts this Image — typically the form, a Frame, or a UserControl. Read with Get, change with Set.
ControlType
A read-only ControlTypeConstants value identifying this control as an image. Always vbImage.
DataChanged
Whether the bound Picture has been written to since the last save or refresh from the DataSource. Boolean. Setting DataChanged = True also marks the bound recordset as dirty.
DataField
The name of the field, in the recordset of the bound DataSource, whose binary value is mirrored by Picture. String.
DataFormat
Note
Reserved for compatibility with VB6; not currently implemented in twinBASIC.
DataMember
Note
Reserved for compatibility with VB6; not currently implemented in twinBASIC.
DataSource
A reference to a Data control (or other DataSource provider) whose recordset supplies the value for DataField. Set with Set.
Dock
Where the Image is docked within its container. A member of DockModeConstants: vbDockNone (default), vbDockLeft, vbDockTop, vbDockRight, vbDockBottom, or vbDockFill. Docked images ignore Anchors.
DragIcon
A StdPicture used as the mouse cursor while the control is being drag-and-dropped (see Drag and DragMode).
DragMode
Whether the control should drag itself (the manual VB-drag form, distinct from OLE drag) when the user holds the mouse over it. A member of DragModeConstants: vbManual (0, default — call Drag from code) or vbAutomatic (1).
Enabled
Determines whether the control accepts mouse input. A disabled Image still paints normally but ignores mouse events. Boolean, default True.
Height
The control’s height, in twips by default (or in the container’s ScaleMode units). Double. When Stretch is False and a new Picture is assigned, the height auto-resizes to the picture’s natural pixel height.
Index
When the control is part of a control array, the Long zero-based index of this instance within the array. Reading Index on a non-array instance raises run-time error 343 (Object not an array). Read-only at run time.
Left
The horizontal distance from the left edge of the container to the left edge of the control. Double.
MouseIcon
A StdPicture used as the mouse cursor when MousePointer is vbCustom and the pointer is over the control.
MousePointer
The mouse cursor shown when the pointer is over the control. A member of MousePointerConstants.
Name
The unique design-time name of the control on its parent form. Read-only at run time.
OLEDragMode
Whether an OLE drag is started automatically when the user begins dragging the Image. A member of OLEDragConstants: vbOLEDragManual (0, default — application calls OLEDrag) or vbOLEDragAutomatic (1 — the framework picks up the current Picture into the resulting DataObject automatically).
OLEDropMode
How the Image responds to OLE drops landing on it. A restricted member of OLEDropConstants: vbOLEDropNone (0, default) or vbOLEDropManual (1). Automatic drop is not supported on an Image; assigning vbOLEDropAutomatic raises run-time error 5 (Invalid procedure call or argument).
Parent
A reference to the Form (or UserControl) that ultimately contains the control. Read-only.
Picture
The StdPicture rendered by the control. Default property.
Syntax: Set object.Picture = picture
Assigning Nothing restores an empty picture rather than removing the surface. Assigning a new picture while Stretch is False auto-resizes the control to the picture’s natural pixel dimensions; while Stretch is True the existing rectangle is preserved and the new picture is scaled to fit.
PictureDpiScaling
When True, the picture’s natural pixel dimensions are multiplied by the current DPI scale factor before being drawn (and used by the auto-size logic). Boolean, default False.
Stretch
Whether the picture is scaled to fill the control’s rectangle (True) or rendered at its natural size with the control auto-sized to fit (False, default). See Stretch and auto-sizing for the full rules. Metafiles always scale regardless of this setting.
StretchMode
The resampling algorithm used when Stretch is True and the picture is scaled. A member of Image.StretchModeConstants:
| Constant | Value | Algorithm |
|---|---|---|
| vbStretchHalftone | 0 | GDI STRETCH_HALFTONE (default — good general-purpose quality). |
| vbStretchColorOnColor | 1 | GDI STRETCH_COLORONCOLOR (fastest, lowest quality — nearest neighbour). |
| vbStretchLanczos8 | 2 | Custom Lanczos resampler with an 8-lobe kernel (highest quality, slowest). |
| vbStretchLanczos3 | 3 | Custom Lanczos resampler with a 3-lobe kernel (high quality). |
| vbStretchBicubic | 4 | Custom bicubic resampler. |
| vbStretchBilinear | 5 | Custom bilinear resampler. |
The Lanczos, bicubic, and bilinear modes only apply to bitmaps that actually need resizing — metafiles and unscaled bitmaps fall back to the GDI mode.
Tag
A free-form String the application can use to associate custom data with the control. Ignored by the framework.
ToolTipText
A multi-line String displayed as a tooltip when the user hovers over the control.
Top
The vertical distance from the top of the container to the top of the control. Double.
Visible
Whether the control is shown. Boolean, default True.
WhatsThisHelpID
Note
Reserved for compatibility with VB6; not currently implemented in twinBASIC. See ShowWhatsThis.
Width
The control’s width, in twips by default (or in the container’s ScaleMode units). Double. When Stretch is False and a new Picture is assigned, the width auto-resizes to the picture’s natural pixel width.
Methods
Drag
Begins, completes, or cancels a manual VB-style drag operation. Distinct from OLE drag — see OLEDrag.
Syntax: object.Drag [ Action ]
- Action
- optional A member of DragConstants: vbCancel (0), vbBeginDrag (1, default), or vbEndDrag (2).
Move
Repositions and optionally resizes the control in a single call.
Syntax: object.Move Left [, Top [, Width [, Height ] ] ]
- Left
- required A Single giving the new horizontal position.
- Top, Width, Height
- optional New values for the corresponding properties. Omitted values are left unchanged.
OLEDrag
Initiates an OLE drag operation from this Image, raising the OLEStartDrag event so the application can populate the DataObject (or, if the source has already been pre-populated, kicks off the drag immediately).
Syntax: object.OLEDrag
Refresh
Forces an immediate repaint of the Image’s rectangle on the parent’s drawing surface.
Syntax: object.Refresh
ShowWhatsThis
Note
Reserved for compatibility with VB6; not currently implemented in twinBASIC.
Syntax: object.ShowWhatsThis
ZOrder
Brings the Image to the front or back of the windowless-sibling stack within its container.
Syntax: object.ZOrder [ Position ]
- Position
- optional A member of ZOrderConstants: vbBringToFront (0, default) or vbSendToBack (1).
Events
Click
Raised when the user single-clicks the control’s rectangle. Default event.
Syntax: object_Click( )
DblClick
Raised when the user double-clicks the control’s rectangle.
Syntax: object_DblClick( )
DragDrop
Raised on the destination control when a manual VB-style drag operation ends over it.
Syntax: object_DragDrop( Source As Control, X As Single, Y As Single )
DragOver
Raised on the control under the cursor while a manual VB-style drag operation is in progress.
Syntax: object_DragOver( Source As Control, X As Single, Y As Single, State As Integer )
Initialize
Raised once, after the control has been wired into its container’s paint cycle but before it is first painted. Useful for last-minute setup that depends on container state.
Syntax: object_Initialize( )
MouseDown
Raised when the user presses any mouse button over the control.
Syntax: object_MouseDown( Button As Integer, Shift As Integer, X As Single, Y As Single )
MouseMove
Raised when the cursor moves over the control.
Syntax: object_MouseMove( Button As Integer, Shift As Integer, X As Single, Y As Single )
MouseUp
Raised when the user releases a mouse button over the control.
Syntax: object_MouseUp( Button As Integer, Shift As Integer, X As Single, Y As Single )
OLECompleteDrag
Raised on the source control when the OLE drag operation finishes, indicating which effect (copy, move, none) the destination accepted.
Syntax: object_OLECompleteDrag( Effect As Long )
OLEDragDrop
Raised on the destination control when the user drops data on it.
Syntax: object_OLEDragDrop( Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single )
OLEDragOver
Raised on the destination control while an OLE drag passes over it.
Syntax: object_OLEDragOver( Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer )
OLEGiveFeedback
Raised on the source control during a drag so the application can adjust the cursor or other visual feedback.
Syntax: object_OLEGiveFeedback( Effect As Long, DefaultCursors As Boolean )
OLESetData
Raised on the source control when the destination requests data in a format that was registered but not yet supplied.
Syntax: object_OLESetData( Data As DataObject, DataFormat As Integer )
OLEStartDrag
Raised on the source control at the start of an OLE drag, so the application can populate the DataObject and choose the allowed effects.
Syntax: object_OLEStartDrag( Data As DataObject, AllowedEffects As Long )