STM32 - Widgets EMWIN (trece)

EMWI

prefacio

Los gadgets son varias ventanas con propiedades de tipo objeto, llamadas controles en el mundo de las ventanas, y son los elementos que componen la interfaz de usuario. Pueden reaccionar automáticamente a ciertos eventos, por ejemplo, cuando se presiona un botón, se puede mostrar en diferentes estados. Los gadgets deben crearse, tienen propiedades que se pueden cambiar en cualquier momento durante su vida útil y, por lo general, se eliminan cuando ya no se necesitan. Al igual que una ventana, se hace referencia a un gadget mediante el identificador devuelto por su función de creación, un gadget requiere un administrador de ventanas y, una vez que se crea un gadget, se puede manejar como cualquier otra ventana. WM asegura que se muestre correctamente (y se redibuje) siempre que sea necesario, los gadgets no son necesarios para escribir una aplicación o interfaz de usuario, pero simplifican enormemente la programación

1. Conocimientos básicos de gadgets

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

2. Cómo usar los dispositivos

1. Mecanismo de repintado

Un widget se dibuja a sí mismo según sus propiedades, lo que se realiza cuando se llama a WM_Exec(), GUI_Exec() o GUI_Delay(). En un entorno multitarea, normalmente es una tarea en segundo plano llamar a WM_Exec() y actualizar los widgets (y todas las demás ventanas que tienen devoluciones de llamada). Cuando se cambian las propiedades de un widget, la ventana del widget (o parte de ella) se marca como no válida pero no se vuelve a dibujar de inmediato, por lo que el fragmento de código se ejecuta muy rápidamente. WM realiza el repintado más tarde, o lo fuerza llamando a WM_Paint() para el widget (o hasta que se llama a WM_Exec() cuando todas las ventanas están repintadas).

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2. Uso de aparatos

Supongamos que queremos mostrar una barra de progreso, todo lo que necesitamos es el siguiente código:

PROGBAR_Handle hProgBar; (1)
GUI_DispStringAt("Progress bar", 100, 20);
hProgBar = PROGBAR_Create(100, 40, 100, 20, WM_CF_SHOW); (2)

(1), defina un identificador de barra de progreso.
(2) Llame a la función PROGBAR_Create() para crear una barra de progreso. Una vez completada la creación, el administrador de ventanas dibujará automáticamente este widget cuando llame al único WM_Exec(). Cada tipo de gadget tiene varias funciones miembro que modifican su apariencia. Una vez que se crea el gadget, sus propiedades se pueden cambiar llamando a una de sus funciones miembro, que utiliza el identificador del gadget como primer argumento. Para hacer que la barra de progreso creada anteriormente muestre el 45 % y cambiar el color de la barra de la configuración predeterminada (gris oscuro/claro) a verde/rojo, se puede usar el siguiente fragmento de código:

PROGBAR_SetBarColor(hProgBar, 0, GUI_GREEN);
PROGBAR_SetBarColor(hProgBar, 1, GUI_RED);
PROGBAR_SetValue(hProgBar, 45);

inserte la descripción de la imagen aquí
Configuraciones predeterminadas
Todos los gadgets también tienen una o más macros de configuración que definen varias configuraciones predeterminadas (como las fuentes y los colores utilizados).

Cómo se comunican los
gadgets Los gadgets generalmente se crean como ventanas secundarias, la ventana principal puede ser cualquier tipo de ventana, incluso otro gadget, para garantizar la sincronización, por lo general se debe notificar cada vez que ocurre un evento en cualquier ventana secundaria de la ventana principal Ventana principal. Cuando ocurre un evento, el widget secundario se comunica con su ventana principal mediante el envío del mensaje WM_NOTIFY_PARENT, y el código de notificación enviado como parte del mensaje depende del evento. La mayoría de los widgets tienen una o más máscaras de código de notificación
que
definen diferentes tipos de eventos. La apariencia de los widgets se puede modificar usando sus respectivas funciones de miembro, algunas de las cuales admiten la máscara. Si se utiliza la máscara en un gadget, la "máscara" determinará la apariencia del gadget y algunas funciones de los miembros no tendrán efecto.
El uso de memoria dinámica para gadgets
en aplicaciones integradas suele ser menos deseable debido al efecto de división. Se pueden usar muchas estrategias diferentes para evitar esta situación, pero siempre que los punteros de la aplicación hagan referencia al área de memoria, el uso es limitado. . Por lo tanto, emWin utiliza un enfoque diferente: todos los objetos (y todos los datos almacenados en tiempo de ejecución) se almacenan en el área de memoria a la que hace referencia el identificador. Esto le permite reasignar regiones de memoria asignadas en tiempo de ejecución, evitando así problemas de asignación a largo plazo que pueden ocurrir cuando se usan punteros. Por lo tanto, todos los gadgets usan referencias de identificadores.

3. Funciones API de control comunes

1. Funciones WM para controles

Dado que los gadgets son esencialmente ventanas, son compatibles con cualquier rutina API del administrador de ventanas. El identificador del gadget se usa como parámetro hWin y el gadget se trata como cualquier otra ventana.

WM_DeleteWindow() 删除窗口。
WM_DisableMemdev() 禁止使用存储设备进行重绘。
WM_EnableMemdev() 启用存储设备用于重绘。
WM_InvalidateWindow() 使窗口无效。
WM_Paint() 立即绘制或重绘窗口。

2. Funciones API comunes

<WIDGET>_Callback() 默认回调函数。
<WIDGET>_CreateIndirect() 用于对话框中的自动创建。
<WIDGET>_CreateUser() 使用额外字节作为用户数据创建小工具。
<WIDGET>_GetUserData() 检索用<WIDGET>_SetUserData 设置的数据。
<WIDGET>_SetUserData() 设置小工具的额外数据。
WIDGET_GetDefaultEffect() 返回用于小工具的默认效果。
WIDGET_SetDefaultEffect() 设置用于小工具的默认效果。
WIDGET_SetEffect() 设置用于给定小工具的效果。

Indica el nombre del gadget, del cual la función _CreateIndirect() es particularmente importante, porque esta función se usa para crear cada gadget cuando se usa el cuadro de diálogo.

3._CrearIndirecto()

Descripción
Crea un widget para usar en un diálogo.
prototipo de función

<WIDGET>_Handle <WIDGET>_CreateIndirect(
const GUI_WIDGET_CREATE_INFO * pCreateInfo,
WM_HWIN hParent,
int x0,
int y0,
WM_CALLBACK * cb);

Información adicional
Cualquier widget se puede crear indirectamente usando un prefijo apropiado. Por ejemplo: BUTTON_CreateIndirect() crea indirectamente un widget de botón, CHECKBOX_CreateIndirect() crea indirectamente un widget de casilla de verificación, etc. Solo es necesario crear un widget indirectamente si se va a incluir en un diálogo, de lo contrario, se puede crear directamente usando la función _Create().

Supongo que te gusta

Origin blog.csdn.net/qq_51963216/article/details/124034681
Recomendado
Clasificación