STM32 - widgets EMWIN (treze)

EMWI

prefácio

Gadgets são várias janelas com propriedades do tipo objeto, chamadas de controles no mundo das janelas, e são os elementos que compõem a interface do usuário. Eles podem reagir automaticamente a determinados eventos, por exemplo, quando um botão é pressionado, ele pode ser exibido em diferentes estados. Os gadgets precisam ser criados, ter propriedades que podem ser alteradas a qualquer momento durante sua vida útil e geralmente são excluídos quando não são mais necessários. Assim como uma janela, um gadget é referenciado pelo identificador retornado por sua função de criação, um gadget requer um gerenciador de janelas e, uma vez criado, o gadget pode ser tratado como qualquer outra janela. O WM garante que seja exibido corretamente (e redesenhado) sempre que necessário, os gadgets não são necessários para escrever um aplicativo ou interface de usuário, mas simplificam bastante a programação

1. Conhecimento básico de gadgets

insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui

2. Como usar gadgets

1. Mecanismo de repintura

Um widget se desenha de acordo com suas propriedades, o que é executado quando WM_Exec(), GUI_Exec() ou GUI_Delay() é chamado. Em um ambiente multitarefa, geralmente é uma tarefa em segundo plano chamar WM_Exec() e atualizar widgets (e todas as outras janelas que possuem retornos de chamada). Quando as propriedades de um widget são alteradas, a janela do widget (ou parte dela) é marcada como inválida, mas não redesenhada imediatamente, de modo que o trecho de código é executado muito rapidamente. A repintura é executada posteriormente pelo WM ou forçada chamando WM_Paint() para o widget (ou até que WM_Exec() seja chamado quando todas as janelas forem 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 gadgets

Suponha que queremos exibir uma barra de progresso, tudo o que precisamos é o seguinte 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 uma alça de barra de progresso.
(2) Chame a função PROGBAR_Create() para criar uma barra de progresso.Após a criação, o gerenciador de janelas desenhará automaticamente este widget ao chamar o único WM_Exec(). Cada tipo de gadget tem várias funções de membro que modificam sua aparência. Uma vez que o gadget é criado, suas propriedades podem ser alteradas chamando uma de suas funções de membro, que usam o identificador do gadget como o primeiro argumento. Para fazer a barra de progresso criada acima mostrar 45% e alterar a cor da barra das configurações padrão (cinza escuro/claro) para verde/vermelho, o seguinte trecho de código pode ser usado:

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

insira a descrição da imagem aqui
Configurações padrão
Todos os gadgets também possuem uma ou mais macros de configuração que definem várias configurações padrão (como as fontes e cores usadas).

Como os gadgets se comunicam
Gadgets geralmente são criados como janelas filhas, a janela pai pode ser qualquer tipo de janela, até mesmo outro gadget, para garantir a sincronização, ela geralmente deve ser notificada sempre que ocorrer algum evento em qualquer janela filha da janela pai Janela pai. Quando ocorre um evento, o widget filho se comunica com sua janela pai enviando a mensagem WM_NOTIFY_PARENT e o código de notificação enviado como parte da mensagem depende do evento.
A maioria dos widgets tem um ou mais skins de código de notificação que definem diferentes tipos de eventos.A
aparência dos widgets pode ser modificada usando suas respectivas funções de membro, algumas das quais suportam skins. Se for usado skin em um gadget, o "skin" determinará a aparência do gadget e algumas funções de membro não terão efeito.
O uso de memória dinâmica para gadgets
em aplicações embarcadas geralmente é menos desejável devido ao efeito de divisão. Muitas estratégias diferentes podem ser usadas para evitar esta situação, mas desde que a área de memória seja referenciada por ponteiros na aplicação, o uso é limitado . Portanto, o emWin usa uma abordagem diferente: todos os objetos (e todos os dados armazenados em tempo de execução) são armazenados na área de memória referenciada pelo handle. Isso permite realocar regiões de memória alocadas em tempo de execução, evitando assim problemas de alocação de longo prazo que podem ocorrer ao usar ponteiros. Portanto, todos os gadgets usam referências de identificador.

3. Funções comuns da API de controle

1. Funções WM para controles

Como os gadgets são essencialmente janelas, eles são compatíveis com qualquer rotina da API do gerenciador de janelas. O identificador do gadget é usado como parâmetro hWin e o gadget é tratado como qualquer outra janela.

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

2. Funções comuns da API

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

Indica o nome do gadget, do qual a função _CreateIndirect() é particularmente importante, pois esta função é usada para criar cada gadget ao usar a caixa de diálogo.

3._CreateIndirect()

Descrição
Cria um widget para ser usado em um diálogo.
protótipo de função

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

Informações Adicionais
Qualquer widget pode ser criado indiretamente usando um prefixo apropriado. Por exemplo: BUTTON_CreateIndirect() cria indiretamente um widget de botão, CHECKBOX_CreateIndirect() cria indiretamente um widget de caixa de seleção e assim por diante. Só é necessário criar um widget indiretamente se ele for incluído em uma caixa de diálogo, caso contrário, ele pode ser criado diretamente usando a função _Create().

Acho que você gosta

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