PBToolboxAI v1 ← Site

picture — u_pbt_picture #

← Component reference · Guide contents

Image display: every common format, framing modes, alignment, automatic graying and a counter badge.

See it live — Demo application, Picture tile: the preview, the code behind it and this page, side by side.


At a glance #

Userobjectu_pbt_picture
Item class— (component without items)
Used forReplacing a PowerBuilder picture: modern formats (SVG, WebP, animated GIF), controlled framing, clickable image, automatic graying
Opt-in optionsib_track_mouse

Quick start #

// window open event
uo_image.is_source  = "img\logo.png"
uo_image.is_stretch = uo_image.STRETCH_UNIFORM   // fits without distorting
uo_image.is_align   = uo_image.ALIGN_CENTER
uo_image.is_tooltip = "Company logo"

Where the image comes from: is_source #

is_source accepts four forms, all interchangeable:

FormExampleUse
Local fileimg\logo.pngpng, jpg, bmp, gif, ico, svg, webp
Web addresshttps://…/logo.pngImage loaded from a server (http or https)
Embedded datadata:image/png;base64,…Image already in memory, with no intermediate file
DLL resourceimg\packimages.dll:SAMPLEImage packaged in a resource DLL

An anim: prefix can be placed in front of a GIF to explicitly flag an animation (GIFs animate anyway).

When the same name exists under several resource types in a DLL, state the type: img\packimages.dll:PNG/SAMPLE, SVG/SAMPLE, ICON/APP, RCDATA/BLOB. See Images and icons for the mono: and tint: prefixes, which recolor a glyph according to the theme.


How it is framed: is_stretch #

ConstantEffect
STRETCH_UNIFORMDefault. The image is scaled without distortion and stays fully visible; margins may appear
STRETCH_UNIFORMTOFILLScaled without distortion, but the frame is filled completely; anything overflowing is cropped
STRETCH_FILLThe image is stretched to fit the frame exactly — it may be distorted
STRETCH_NONEOriginal size, no scaling

is_align decides the horizontal position of the image when it is smaller than the control: ALIGN_CENTER (default), ALIGN_START, ALIGN_END. The vertical axis has its own property, is_valign.


Constants #

ConstantValueFor
STRETCH_NONE · STRETCH_FILL · STRETCH_UNIFORM · STRETCH_UNIFORMTOFILL"none" "fill" "uniform" "uniformtofill"is_stretch
ALIGN_CENTER · ALIGN_START · ALIGN_END"center" "start" "end"is_align
VALIGN_TOP · VALIGN_CENTER · VALIGN_BOTTOM"top" "center" "bottom"is_valign
is_valignstringVALIGN_CENTERVertical placement when the image is smaller than the control: VALIGN_TOP, VALIGN_CENTER, VALIGN_BOTTOM. The two axes are independent — is_align gives the column, this one the row — which is what makes a corner reachable
ROTATION_NONE · ROTATION_90 · ROTATION_180 · ROTATION_2700 90 180 270ii_rotation

ALIGN_START and ALIGN_END are logical: they follow the writing direction (Language and RTL). The physical values left and right are still accepted as aliases.


Properties #

PropertyTypeDefaultPurpose
is_sourcestring""The image to display (see the four forms above)
is_stretchstring"uniform"Framing mode: STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL
is_alignstring"center"Horizontal placement when the image is smaller than the control: ALIGN_CENTER, ALIGN_START, ALIGN_END. The vertical axis is is_valign
ib_enabledbooleantrueWhen false, the image is displayed in grayscale
ii_badgeinteger0Counter badge in the upper-right corner (0 = none)
il_badge_colorlong0Badge background, as a PowerBuilder RGB value (0 = the color that comes from the theme). The text color is picked automatically so that the counter stays legible
ii_badge_sizeinteger0Badge height in pixels (0 = the size that comes from the theme). The font size follows on its own: the counter stays centered whatever the size
ib_track_mousebooleanfalseOpt-in: enables ue_mouse_enter / ue_mouse_leave
is_placeholderstring""Stand-in image, shown while is_source is empty (an « add a photo » frame, a silhouette). Displayed dimmed: a stand-in is not the content, and it is never announced as a loaded image. Accepts the mono: prefix, which recolours a monochrome glyph with the theme
is_error_sourcestring""Fallback image when the source fails to load. Leave it empty and the component shows its own error glyph — never an empty box, which tells the user nothing while ue_error only travels to your code. Accepts the mono: prefix
ii_rotationinteger0Quarter turns, for the scans and photos that arrive lying down: ROTATION_NONE, ROTATION_90, ROTATION_180, ROTATION_270 (anything else reads as 0). A quarter turn swaps the fitting axes as well, so the picture keeps its proportions instead of being squashed
ib_mirrorbooleanfalseHorizontal mirror, applied on top of the rotation
ib_zoomablebooleanfalseOpt-in: the user may come closer (wheel), move around (drag) and go back to the fitted view (double click). For a plan, a scan or a photo — where four fixed fitting modes are not enough
id_zoomdouble1.0Zoom factor: 1.0 means the whole picture fits, up to 8.0. Reading it back gives the current factor, wheel included (ue_zoom_changed tells you at every step). Needs ib_zoomable
ib_allow_dropbooleanfalseOpt-in: accepts files dropped from the Windows Explorer. The frame shows it is armed, and the full paths arrive through ue_drop_files — loading them into is_source is up to your application
ib_auto_heightbooleanfalseOpt-in: the userobject takes the height that keeps the image's proportions at its current width. For a picture that height is deducible: no need to compute it yourself from the dimensions reported by ue_loaded
is_theme_stylestringfluentVisual style of the component (THEME_STYLE_* constants)
is_theme_modestringlightLight or dark variant (THEME_MODE_* constants)
il_theme_accentlong-1Accent color of this component (-1 = the theme accent)
is_tooltipstring""Simple tooltip shown when hovering the component
is_super_tooltip_titlestring""Title of the rich tooltip (takes precedence over is_tooltip)
is_super_tooltip_textstring""Text of the rich tooltip (rich markup accepted)
is_super_tooltip_imagestring""Image of the rich tooltip

Methods #

MethodPurpose
of_reset ( )Resets every property to its default and removes the image
of_set_redraw (boolean)Groups a burst of changes into a single render
of_save_as_png (string) · of_save_as_jpg (string)Exports the rendering as an image

Events #

EventRaised when
ue_clicked ( )Left click on the image
ue_loaded (long al_width, long al_height)The image has loaded; the arguments carry its original size in pixels
ue_error (string as_message)The image could not be loaded (missing file, unreachable address, rejected format)
ue_rclicked ( )Right click on the image
ue_double_clicked ( )Double click on the image. The single clicks that precede it are raised too, in the same order. When ib_zoomable is on, the double click also brings the picture back to the fitted view: the event is raised either way, and what it means is up to you
ue_zoom_changed (double ad_zoom)The zoom factor changed, whether from the wheel or from id_zoom. 1.0 means the whole picture fits again
ue_auto_height (long al_height)The component settled on a new height; the userobject has already been resized when this fires. Needs ib_auto_height
ue_drop_files (string as_files[])Files dropped from the Explorer: full paths, one entry per file. Needs ib_allow_drop
ue_drag_enter ( )A file drag entered the component (ib_allow_drop)
ue_drag_leave ( )The file drag left the component
ue_mouse_enter ( )The mouse enters — requires ib_track_mouse = true
ue_mouse_leave ( )The mouse leaves — requires ib_track_mouse = true
ue_ready ( )The component has finished loading; everything sent beforehand has been replayed
ue_runtime_missing ( )The WebView2 runtime is missing: the component stays empty
ue_bg_color (long al_color)The component has computed its theme background color; the userobject has already adopted it (backcolor)

Examples #

Showing the photo on a record #

// ue_row_changed event of the datawindow : show the photo of the current customer
uo_photo.is_source  = "photos\" + ls_code_client + ".jpg"
uo_photo.is_stretch = uo_photo.STRETCH_UNIFORMTOFILL   // fills the frame, the overflow is cropped
uo_photo.is_align   = uo_photo.ALIGN_CENTER
// ue_error event of uo_photo : (string as_message)
uo_photo.is_source = "img\photo_absente.svg"     // fallback image

Handling ue_error is the right way to deal with a missing photo: there is no need to test whether the file exists before assigning it.

A clickable image, button-style #

uo_avatar.is_source    = "photos\utilisateur.png"
uo_avatar.is_tooltip   = "My account"
// ue_clicked event of uo_avatar
of_ouvrir_mon_compte()

Counter and graying #

// A notification badge on a mail icon
uo_messagerie.is_source = "img\packimages.dll:SVG/MAIL"
uo_messagerie.ii_badge  = ll_non_lus       // 0 makes the badge disappear

// Red beyond a threshold, theme color otherwise (0)
if ll_non_lus > 20 then
    uo_messagerie.il_badge_color = RGB(200, 30, 30)
else
    uo_messagerie.il_badge_color = 0
end if

// Feature unavailable : the image turns grayscale, with no second image to supply
uo_messagerie.ib_enabled = ib_droit_messagerie

Graying is computed automatically: you do not have to supply a second "disabled" image.

Finding out the real size of the image #

uo_apercu.is_source = ls_fichier_choisi
// ue_loaded event of uo_apercu : (long al_width, long al_height)
uo_statut.of_item("main").is_text = String(al_width) + " x " + String(al_height) + " px"

// An image smaller than the frame : do not enlarge it needlessly
if al_width < uo_apercu.width and al_height < uo_apercu.height then
    uo_apercu.is_stretch = uo_apercu.STRETCH_NONE
end if

A full-width banner #

uo_banniere.is_source  = "img\banniere.jpg"
uo_banniere.is_stretch = uo_banniere.STRETCH_UNIFORMTOFILL   // fills the whole strip, without distorting
uo_banniere.is_valign   = uo_banniere.VALIGN_TOP               // keeps the top of the image visible

Best practices #


← Component reference · Guide contents