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 #
| Userobject | u_pbt_picture |
| Clase de items | — (componente sin items) |
| Sirve para | Sustituir 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-in | 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:
| Forma | Ejemplo | Uso |
|---|---|---|
| Fichero local | img\logo.png | png, jpg, jfif, bmp, gif, ico, svg, webp, avif |
| Dirección web | https://…/logo.png | Imagen cargada desde un servidor (solo https: una dirección http:// se rechaza, véase más abajo) |
| Datos incorporados | data:image/png;base64,… | Imagen que ya está en memoria, sin fichero intermedio |
| Recurso de DLL | img\packimages.dll:SAMPLE | Imagen 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.
Cómo se encuadra: is_stretch #
| Constante | Efecto |
|---|---|
STRETCH_UNIFORM | Predeterminado. La imagen se escala sin deformación y queda totalmente visible; pueden aparecer márgenes |
STRETCH_UNIFORMTOFILL | Escalado sin deformación, pero el marco se rellena por completo; lo que sobresale se recorta |
STRETCH_FILL | La imagen se estira para ocupar exactamente el marco — puede quedar deformada |
STRETCH_NONE | Tamañ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 #
| Constante | Valor | Para |
|---|---|---|
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_270 | 0 90 180 270 | ii_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 #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
is_source | string | "" | La imagen que se debe mostrar (véanse las cuatro formas anteriores) |
is_stretch | string | "uniform" | Modo de encuadre: STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL |
is_align | string | "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_valign | string | VALIGN_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_enabled | boolean | true | A false, la imagen se muestra en escala de grises y ya no responde a nada: clics, rueda, teclado y archivos soltados |
ii_badge | integer | 0 | Distintivo 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) |
il_badge_color | long | -1 | Fondo 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_size | integer | 0 | Altura 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_mouse | boolean | false | Opt-in: activa ue_mouse_enter / ue_mouse_leave |
is_placeholder | string | "" | 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_source | string | "" | 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_rotation | integer | 0 | Cuartos 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_mirror | boolean | false | Espejo horizontal en pantalla: la imagen se voltea de izquierda a derecha, sea cual sea ii_rotation |
ib_zoomable | boolean | false | Opt-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 0); la tecla 1 muestra la imagen a su tamaño REAL, un píxel de la imagen por un píxel de la pantalla. 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_zoom | double | 1.0 | Factor 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, o esta propiedad fijada por su código). Necesita ib_zoomable, fijado antes: sin él el factor se queda en 1.0 |
id_max_zoom | double | 8.0 | El TOPE del zoom, en la unidad de id_zoom (1.0 = el encuadre): la rueda, las teclas e id_zoom se detienen ahí. Cualquier valor a partir de 1.0; por debajo, vuelve el valor por defecto. El tamaño REAL sigue siempre accesible — la tecla 1 lleva a él, y un escaneo grande mostrado pequeño sigue legible píxel a píxel. Bajado por debajo del zoom actual, el zoom desciende a él y ue_zoom_changed lo indica |
ib_allow_drop | boolean | false | Opt-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_height | boolean | false | Opt-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_text | string | "" | Texto alternativo: lo que un lector de pantalla dice de la imagen. Déjelo vacío para una imagen puramente decorativa |
is_theme_style | string | "" | Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio |
is_theme_mode | string | "" | Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio |
il_theme_accent | long | -1 | Color de acento de este componente (-1 = acento de la aplicación, o el del tema) |
is_tooltip | string | "" | Tooltip simple mostrado al pasar el ratón por el componente |
is_super_tooltip_title | string | "" | Título del tooltip enriquecido (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto del tooltip enriquecido (se acepta el marcado enriquecido) |
is_super_tooltip_image | string | "" | Imagen del tooltip enriquecido |
Métodos #
| Método | Funció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_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 #
| Evento | Se activa cuando |
|---|---|
ue_clicked ( ) | Clic izquierdo en la imagen. 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 |
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 +, - y 0, o id_zoom fijado por su código — nada cuando el factor no cambia. 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 ue_row_changed de la datawindow : mostrar la foto del cliente actual
uo_photo.is_source = "photos\" + ls_customer_code + ".jpg"
uo_photo.is_stretch = uo_photo.STRETCH_UNIFORMTOFILL // rellena el marco, lo que sobresale se recorta
uo_photo.is_align = uo_photo.ALIGN_CENTER
// event ue_error de uo_photo : (string as_message, string as_reason)
if as_reason = uo_photo.REASON_NOT_FOUND then
uo_photo.is_source = "img\photo_missing.svg" // imagen de sustitucion
end if
Tratar ue_error es la forma correcta de gestionar una foto que falta: no hace falta comprobar la existencia del fichero antes de asignarlo.
Una imagen en la que se puede hacer clic, a modo de botón #
// La imagen y la descripcion emergente que aparece cuando el raton se posa encima
uo_avatar.is_source = "photos\user.png"
uo_avatar.is_tooltip = "Mi cuenta"
// event ue_clicked de uo_avatar
of_open_my_account()
Contador y escala de grises #
// Un distintivo de notificaciones sobre un icono de correo
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 #
// Show the file the user has chosen
uo_preview.is_source = ls_chosen_file
// 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
if al_width < uo_preview.width and al_height < uo_preview.height 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 #
STRETCH_UNIFORMes el modo seguro: nunca deforma. ReserveSTRETCH_FILLa los fondos decorativos, en los que la deformación no tiene consecuencias.- Para una foto en un marco fijo (orla de fotos, miniatura),
STRETCH_UNIFORMTOFILLda un resultado uniforme, sin márgenes antiestéticos. - Agrupe sus iconos en una DLL de recursos en lugar de entregar cientos de ficheros; la forma
pack.dll:TIPO/NOMBREelimina toda ambigüedad. - Para un glifo monocromo que deba seguir el tema claro y oscuro, utilice el prefijo
mono:(Imágenes e iconos). - Programe
ue_erroren toda imagen cuya fuente dependa de los datos: es su única red de seguridad si falta un fichero. - Llame a
of_reset()antes de reutilizar el componente para una imagen de naturaleza diferente: sin ello, el modo de encuadre, el distintivo o el estado en escala de grises anteriores se mantienen.
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.
| Miembros | Función | Detallado en |
|---|---|---|
of_reset | Poner el componente a cero | 3.6 Poner un componente a cero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atajos de teclado del componente | 3.5 Los atajos de teclado |
of_is_created · of_is_ready · of_get_last_error | Si ha nacido, si está listo, qué ha fallado | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar el render como imagen | 3.8 Exportar la representación como imagen |
of_set_redraw | Agrupar los cambios en un solo repintado | 3.10 Buenas prácticas |
of_preload_icons | Iconos mostrados sin retardo | Visualización instantánea: of_icon |
of_set_translation | Traducir una etiqueta del componente | 5.2 Adaptar una etiqueta: of_set_translation |
of_focus_webview | Dar el foco al componente | 6.4 Teclado y foco |
of_print · of_print_to_pdf | Imprimir, o escribir un PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar una propiedad por su nombre | 3.1 El motor de propiedades |
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.