PBToolboxAI v5 ← Site

picture — u_pbt_picture #

← Referencia de componentes · Índice de la guía

Presentación de imágenes: todos los formatos habituales, modos de encuadre, alineación, escala de grises automática y distintivo de contador.

▶ Verlo en vivo — Aplicación de demostración, mosaico Picture: la vista previa, el código que lo genera y esta página, uno al lado del otro.


De un vistazo #

Userobjectu_pbt_picture
Clase de items— (componente sin items)
Sirve paraSustituir un picture de PowerBuilder: formatos modernos (SVG, WebP, GIF animado), encuadre controlado, imagen en la que se puede hacer clic, escala de grises automática
Opciones opt-inib_zoomable · ib_clickable · ib_allow_drop · ib_auto_height · ib_track_mouse

Inicio rápido #

// event open de la ventana
uo_image.is_source  = "img\logo.png"
uo_image.is_stretch = uo_image.STRETCH_UNIFORM   // adapta sin deformar
uo_image.is_align   = uo_image.ALIGN_CENTER
uo_image.is_tooltip = "Logotipo de la empresa"

De dónde procede la imagen: is_source #

is_source admite cuatro formas, todas ellas intercambiables:

FormaEjemploUso
Fichero localimg\logo.pngpng, jpg, jfif, bmp, gif, ico, svg, webp, avif — and tif, tiff, wmf, emf, rle, converted on the fly
Dirección webhttps://…/logo.pngImagen cargada desde un servidor (solo https: una dirección http:// se rechaza, véase más abajo)
Datos incorporadosdata:image/png;base64,…Imagen que ya está en memoria, sin fichero intermedio
Recurso de DLLimg\packimages.dll:SAMPLEImagen empaquetada en una DLL de recursos

Se puede anteponer un prefijo anim: a un GIF para señalar explícitamente una animación (los GIF se animan de todos modos).

Cuando el mismo nombre existe bajo varios tipos de recurso en una DLL, indique el tipo: img\packimages.dll:PNG/SAMPLE, SVG/SAMPLE, ICON/APP, RCDATA/BLOB. Véase Imágenes e iconos para los prefijos mono: y tint:, que recolorean un glifo según el tema.

Una dirección http:// se rechaza: la página del componente es segura, y el motor pasaría la imagen a https:// sin decir nada — en un servidor de intranet sin TLS fallaría entonces con un mensaje engañoso. El componente la rechaza por tanto de entrada: glifo de error y ue_error con REASON_INSECURE. Para una imagen de un servidor no cifrado, descárguela primero con n_pbt_restclient.of_download en una carpeta temporal y muestre después esa ruta. Volver a asignar la misma ruta relee el fichero: una imagen que su aplicación acaba de reescribir (foto, escaneo, recorte) aparece, como con el Picture nativo. Una imagen del disco no supera 32 MB.

Los formatos del Picture nativo que el motor no lee — TIFF (escaneos, faxes), WMF, EMF y RLE — se convierten al vuelo: una aplicación traída de PowerBuilder conserva sus imágenes. Los espacios alrededor de una ruta se ignoran: una columna CHAR leída por GetItemString llega rellenada con espacios, y Windows también los ignora; is_source se relee tal como lo escribió. Una imagen recoloreada (mono:, tint:) servida por otro sitio en https solo se dibuja si ese servidor autoriza las peticiones de otro origen (cabecera Access-Control-Allow-Origin); si no, ue_error lo indica (REASON_FAILED). Los ficheros del equipo, los recursos de DLL y los data: no se ven afectados.

Una imagen en memoria — una foto almacenada en la base de datos y leída con SelectBlob — se muestra con of_set_picture(blob), como SetPicture del Picture nativo: ni fichero temporal ni base64. El formato se reconoce por los bytes; siguen ue_loaded o ue_error, como para is_source.


Cómo se encuadra: is_stretch #

ConstanteEfecto
STRETCH_UNIFORMPredeterminado. La imagen se escala sin deformación y queda totalmente visible; pueden aparecer márgenes
STRETCH_UNIFORMTOFILLEscalado sin deformación, pero el marco se rellena por completo; lo que sobresale se recorta
STRETCH_FILLLa imagen se estira para ocupar exactamente el marco — puede quedar deformada
STRETCH_NONETamaño original, sin escalado

is_align decide la posición horizontal de la imagen cuando es más pequeña que el control: ALIGN_CENTER (predeterminado), ALIGN_START, ALIGN_END. El eje vertical tiene su propia propiedad, is_valign. La colocación se lee en pantalla: ALIGN_START se queda en el borde inicial sean cuales sean ii_rotation e ib_mirror. Un valor desconocido se relee center.


Constantes #

ConstanteValorPara
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
ROTATION_NONE · ROTATION_90 · ROTATION_180 · ROTATION_2700 90 180 270ii_rotation
REASON_NOT_FOUND · REASON_TOO_LARGE · REASON_INSECURE · REASON_UNSUPPORTED · REASON_FAILED"notfound" "toolarge" "insecure" "unsupported" "failed"ue_error (as_reason)

ALIGN_START y ALIGN_END son lógicos: siguen el sentido de escritura (Idioma y RTL). Los valores físicos left y right se siguen admitiendo como alias.


Propiedades #

PropiedadTipoPredeterminadoFunción
is_sourcestring""La imagen que se debe mostrar (véanse las cuatro formas anteriores)
is_stretchstring"uniform"Modo de encuadre: STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL
is_alignstring"center"Colocación horizontal cuando la imagen es más pequeña que el control: ALIGN_CENTER, ALIGN_START, ALIGN_END. El eje vertical es is_valign
is_valignstring"center"Colocación vertical cuando la imagen es más pequeña que el control: VALIGN_TOP, VALIGN_CENTER, VALIGN_BOTTOM. Los dos ejes son independientes — is_align da la columna, este la fila — y eso es lo que hace alcanzable una esquina
ib_enabledbooleantrueA false, la imagen se muestra en escala de grises y ya no responde a nada: clics, rueda, teclado y archivos soltados
ii_badgeinteger0Distintivo de contador en el ángulo superior de final de línea: a la derecha en lectura de izquierda a derecha, a la izquierda en una de derecha a izquierda (0 = ninguno). Por encima de 99 muestra 99+; un lector de pantalla lo oye con la imagen («Correo, 5 nuevos»)
il_badge_colorlong-1Fondo del distintivo, en RGB de PowerBuilder (-1 = sin fijar: el color que viene del tema; 0 es el negro, como para cualquier otro color). El color del texto se elige automáticamente para que el contador siga siendo legible
ii_badge_sizeinteger0Altura del distintivo en píxeles (0 = el tamaño que viene del tema). El tamaño de la fuente se ajusta solo: el contador sigue centrado sea cual sea la dimensión
ib_track_mousebooleanfalseOpt-in: activa ue_mouse_enter / ue_mouse_leave
is_placeholderstring""Imagen de espera, mostrada mientras is_source está vacía (un marco « añadir una foto », una silueta). Presentada atenuada: un sustituto no es el contenido y nunca se anuncia como imagen cargada. Acepta el prefijo mono:, que recolorea un glifo monocromo con el tema
is_error_sourcestring""Imagen de reserva cuando la fuente falla al cargarse. Déjela vacía y el componente muestra su propio glifo de error — nunca una caja vacía, que no dice nada al usuario mientras ue_error solo va a su código. Acepta el prefijo mono:
ii_rotationinteger0Cuartos de vuelta, para los escaneos y fotos que llegan tumbados: ROTATION_NONE, ROTATION_90, ROTATION_180, ROTATION_270 (cualquier otro valor vale 0). Un cuarto de vuelta intercambia también los ejes de encaje, de modo que la imagen conserva sus proporciones en lugar de aplastarse
ib_mirrorbooleanfalseEspejo horizontal en pantalla: la imagen se voltea de izquierda a derecha, sea cual sea ii_rotation
ib_zoomablebooleanfalseOpt-in: el usuario puede acercarse (rueda, hacia el puntero, o teclas + y -), desplazarse (arrastrar, o flechas — invertidas en lectura de derecha a izquierda) y volver al encuadre (doble clic, o la tecla marcada 0, sea cual sea la distribución del teclado); la tecla 1 muestra la imagen a su tamaño REAL, un píxel de la imagen por un píxel de la pantalla. Con Ctrl o Alt pulsado, estas teclas se dejan a su aplicación. Más grande que su marco, la imagen lo cubre siempre: arrastrar nunca descubre una banda vacía; más pequeña, se queda donde la colocan is_align e is_valign. Solo el botón izquierdo la desplaza. Para un plano, un escaneo, una foto — donde cuatro modos de encaje fijos no bastan
id_zoomdouble1.0Factor de zoom: 1.0 = el encuadre elegido por is_stretch, hasta id_max_zoom (8.0 por defecto). Al releerlo se obtiene el factor actual, rueda y teclado incluidos (ue_zoom_changed avisa de cada cambio: un gesto del usuario, esta propiedad fijada por su código, o una nueva fuente que lo devuelve a 1.0). Necesita ib_zoomable, fijado antes: sin él el factor se queda en 1.0. Fíjelo después de is_source: una nueva imagen vuelve a empezar en el encuadre
id_max_zoomdouble8.0El TOPE del zoom, en la unidad de id_zoom (1.0 = el encuadre): la rueda, la tecla + e id_zoom se detienen ahí, sea cual sea el tamaño de la imagen. Cualquier valor a partir de 1.0; por debajo, vuelve el valor por defecto. Solo la tecla 1 va más allá, hasta el tamaño REAL — un escaneo grande mostrado pequeño sigue legible píxel a píxel; desde ahí, + no hace nada y - vuelve a bajar. Bajado por debajo del zoom actual, el zoom desciende a él y ue_zoom_changed lo indica
ib_allow_dropbooleanfalseOpt-in: acepta archivos soltados desde el Explorador de Windows. El marco muestra que está armado, y las rutas completas llegan por ue_drop_files — cargarlas en is_source corresponde a su aplicación. Una imagen desactivada (ib_enabled = false) rechaza cualquier depósito, e ib_allow_drop se relee tal como se fijó
ib_auto_heightbooleanfalseOpt-in: el userobject toma la altura que respeta las proporciones de la imagen a su anchura actual. Para una imagen esa altura se deduce: no hace falta calcularla uno mismo a partir de las dimensiones de ue_loaded
is_alt_textstring""Texto alternativo: lo que un lector de pantalla dice de la imagen, seguido del número del distintivo, o de «Imagen no disponible» cuando la fuente ha fallado. Déjelo vacío para una imagen puramente decorativa
ib_clickablebooleanfalseOpt-in: la imagen es un BOTÓN — en el orden de tabulación, con un anillo de foco visible, y Intro o Espacio lanzan ue_clicked como un clic (el botón predeterminado de la ventana no responde entonces). Desactivada, sale del orden de tabulación. Un lector de pantalla anuncia un botón nombrado por is_alt_text. Sin ella, una imagen es una imagen: Intro va a la ventana
is_theme_stylestring""Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_modestring""Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accentlong-1Color de acento de este componente (-1 = acento de la aplicación, o el del tema)
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el componente
is_super_tooltip_titlestring""Título del tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido

Métodos #

MétodoFunción
of_reset ( )Restablece todas las propiedades a su valor predeterminado y retira la imagen. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_set_picture (blob ablb_image)Muestra una imagen guardada en memoria — una foto leída de la base de datos con SelectBlob — como SetPicture del Picture nativo: ni fichero temporal ni base64. El formato se reconoce por los bytes (tif, wmf y emf convertidos); is_source relee después la dirección en la que se sirve la imagen, y siguen ue_loaded o ue_error. Devuelve 0 una vez entregada, -5 si el blob está vacío o no es una imagen, -4 por encima de 32 MB, -2 si el componente no está creado
of_set_redraw (boolean)Agrupa una ráfaga de modificaciones en una sola representación. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_save_as_png (string) · of_save_as_jpg (string)Exporta la representación como imagen. Devuelve 0 una vez escrita la imagen, -4 si la escritura falla, -2 si el componente no está creado

Eventos #

EventoSe activa cuando
ue_clicked ( )Clic izquierdo en la imagen — o Intro / Espacio con ib_clickable. Desplazar la imagen ampliada no es un clic, y un doble clic solo lanza uno, como el Picture nativo
ue_loaded (long al_width, long al_height)La imagen está cargada; los parámetros contienen sus dimensiones originales en píxeles. Para un SVG son las dimensiones que declara (width, height); un SVG dibujado al 100 % no declara ninguna, y el motor le da una caja por defecto (150 píxeles de alto, con las proporciones de su dibujo): la proporción es correcta, el tamaño no significa nada
ue_error (string as_message, string as_reason)La imagen no se ha podido cargar. as_message nombra la fuente (image load failed : <source>), as_reason dice por qué: REASON_NOT_FOUND (fichero ausente), REASON_TOO_LARGE (más de 32 MB), REASON_INSECURE (una dirección http://, rechazada), REASON_UNSUPPORTED (un formato que el componente no muestra), REASON_FAILED (todo lo demás: un fichero que no se decodifica, un servidor que no responde)
ue_rclicked ( )Clic derecho en la imagen
ue_double_clicked ( )Doble clic en la imagen. Lo precede un solo ue_clicked, nunca dos — como el Picture nativo. Cuando ib_zoomable está activo, el doble clic también devuelve al encuadre: el evento se emite en ambos casos, y usted decide qué significa
ue_zoom_changed (double ad_zoom)El factor de zoom cambió: rueda, doble clic, teclas +, -, 0 y 1, id_zoom o un id_max_zoom más bajo fijados por su código, una nueva is_source o ib_zoomable desactivado (vuelta a 1.0) — nada cuando el factor no cambia, ni en of_reset. 1.0 significa la vuelta al encuadre de is_stretch
ue_auto_height (long al_height)El componente se detuvo en una nueva altura; el userobject ya está redimensionado cuando se emite. Necesita ib_auto_height
ue_drop_files (string as_files[])Archivos soltados desde el Explorador: rutas completas, una entrada por archivo. Necesita ib_allow_drop
ue_drag_enter ( )Un arrastre de archivos entra en el componente (ib_allow_drop)
ue_drag_leave ( )El arrastre de archivos abandona el componente
ue_mouse_enter ( )El ratón entra — requiere ib_track_mouse = true
ue_mouse_leave ( )El ratón sale — requiere ib_track_mouse = true
ue_ready ( )El componente ha terminado de cargarse; todo lo enviado antes se ha reproducido
ue_runtime_missing ( )El runtime WebView2 está ausente: el componente permanece vacío
ue_bg_color (long al_color)El componente ha calculado el color de fondo de su tema; el userobject ya lo ha adoptado (backcolor)

Ejemplos #

Mostrar la foto de una ficha #

// event rowfocuschanged de dw_customer : mostrar la foto del cliente actual
// Local variables
string ls_customer_code

// El codigo del cliente de la nueva fila
if currentrow < 1 then return
ls_customer_code = this.GetItemString(currentrow, "customer_code")

// La foto rellena su marco ; los espacios de una columna CHAR se ignoran
uo_photo.is_source  = "photos\" + ls_customer_code + ".jpg"
uo_photo.is_stretch = uo_photo.STRETCH_UNIFORMTOFILL
// Una vez, en el event open de la ventana : la imagen que se muestra cuando falta una foto
uo_photo.is_error_source = "img\photo_missing.svg"
// event ue_error de uo_photo : (string as_message, string as_reason)
// La imagen de sustitucion ya se muestra : aqui, solo contar las fotos que faltan
if as_reason = uo_photo.REASON_NOT_FOUND then
    il_missing_photos = il_missing_photos + 1
end if

is_error_source es la forma correcta de gestionar una foto que falta: no hace falta comprobar la existencia del fichero antes de asignarlo. No vuelva a asignar nunca is_source desde ue_error: si a su vez faltara la imagen de sustitución, el fallo relanzaría la carga sin fin.

Mostrar una foto almacenada en la base de datos #

// Local variables
blob lb_photo

// La foto del empleado, almacenada en una columna de la base de datos
SELECTBLOB photo INTO :lb_photo FROM employee WHERE emp_id = 4152 USING SQLCA;

// Mostrada directamente desde la memoria : 0 = entregada, -5 = no es una imagen
if uo_photo.of_set_picture(/*image*/ lb_photo) <> 0 then
    uo_photo.is_source = ""
end if

Una imagen en la que se puede hacer clic, a modo de botón #

// La imagen, su nombre para el teclado y los lectores de pantalla, y su descripcion emergente
uo_avatar.is_source    = "photos\user.png"
uo_avatar.is_alt_text  = "Mi cuenta"
uo_avatar.is_tooltip   = "Mi cuenta"

// Un boton tambien para el teclado : Tab lo alcanza, Intro o Espacio lanzan ue_clicked
uo_avatar.ib_clickable = true
// event ue_clicked de uo_avatar
of_open_my_account()

Contador y escala de grises #

// Local variables
long ll_unread

// Un distintivo de notificaciones sobre un icono de correo
ll_unread = 7
uo_mail.is_source = "img\packimages.dll:SVG/MAIL"
uo_mail.ii_badge  = ll_unread       // 0 hace desaparecer el distintivo

// Distintivo rojo a partir de un umbral, color del tema en caso contrario (-1)
if ll_unread > 20 then
    uo_mail.il_badge_color = RGB(/*red*/ 200, /*green*/ 30, /*blue*/ 30)
else
    uo_mail.il_badge_color = -1
end if

// Funcion no disponible : la imagen pasa a escala de grises, sin necesidad de otra imagen
uo_mail.ib_enabled = ib_mail_allowed

La escala de grises se calcula automáticamente: usted no tiene que proporcionar una segunda imagen «desactivada».

Conocer las dimensiones reales de la imagen #

// Local variables
string ls_chosen_file, ls_name

// Show the file the user has chosen
if GetFileOpenName("Picture", ls_chosen_file, ls_name, "jpg", "Pictures (*.jpg;*.png),*.jpg;*.png", /*initdir*/ "", OFN_EXPLORER + OFN_NOCHANGEDIR) = 1 then
    uo_preview.is_source = ls_chosen_file
end if
// event ue_loaded de uo_preview : (long al_width, long al_height)
uo_status.of_panel(/*key*/ "main").is_text = String(al_width) + " x " + String(al_height) + " px"

// Una imagen mas pequena que el marco : no ampliarla inutilmente. El tamano de la imagen
// esta en PIXELES, el del userobject en unidades PowerBuilder : compararlos en la misma unidad
if al_width < UnitsToPixels(uo_preview.width, XUnitsToPixels!) and al_height < UnitsToPixels(uo_preview.height, YUnitsToPixels!) then
    uo_preview.is_stretch = uo_preview.STRETCH_NONE
end if

Un banner a todo lo ancho #

// La imagen del banner, que llena su franja
uo_banner.is_source  = "img\banniere.jpg"
uo_banner.is_stretch = uo_banner.STRETCH_UNIFORMTOFILL   // rellena toda la banda, sin deformar
uo_banner.is_valign   = uo_banner.VALIGN_TOP               // mantiene visible la parte alta de la imagen

Buenas prácticas #

Heredado de la base común #

Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.

MiembrosFunciónDetallado en
of_resetPoner el componente a cero3.6 Poner un componente a cero: of_reset()
of_register_shortcut · of_clear_shortcutsAtajos de teclado del componente3.5 Los atajos de teclado
of_is_created · of_is_ready · of_get_last_errorSi ha nacido, si está listo, qué ha fallado3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar el render como imagen3.8 Exportar la representación como imagen
of_set_redrawAgrupar los cambios en un solo repintado3.10 Buenas prácticas
of_preload_iconsIconos mostrados sin retardoVisualización instantánea: of_icon
of_set_translationTraducir una etiqueta del componente5.2 Adaptar una etiqueta: of_set_translation
of_focus_webviewDar el foco al componente6.4 Teclado y foco
of_print · of_print_to_pdfImprimir, o escribir un PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar una propiedad por su nombre3.1 El motor de propiedades
is_accessible_name · is_accessible_descriptionEl nombre y la descripción que dice un lector de pantalla3.4 Propiedades y eventos opcionales

Dos ayudas no se heredan: of_icon y of_escape_markup viven en n_pbt_utils. Declare uno — n_pbt_utils lnv_utils, nada que crear — y llámelas sobre él.


← Referencia de componentes · Índice de la guía