TouchGFX使用自定义容器实现对话框、虚拟键盘等功能

2023-05-16

软件环境:STM32CubeMX5.3  、TouchGFX 4.10.0 Designer、uVision5.28.0.0

硬件环境:正点原子阿波罗STM32F767开发板、4.3寸LCD接口屏(480×272)

源码链接: https://github.com/ningjw/stm32f7_os/tree/bb1ae5387d1188141e9f6d582fd5c51dcb8fb02e

在进行触摸屏界面设计时,对话框与虚拟键盘是最常用的,本篇主要就将如何通过自定义 容器实现这两种功能。
最终效果图如下所示:

 

1. 打开TouchGFX软件,单击Custom Container下的“+”号,添加自定义容器,命名为ContainerDialog

2. 往你刚刚新建的容器中添加控件,下面这个对话框由Image + Text Area + 两个Button组成,设计完界面后就可以点击“Generate Code”按钮生成代码了。打开KEIL工程,可以发现在Application/User/TouchGFX/generated文件夹下有containerdialogbase.cpp文件,该文件实现了对下方对话框的界面设计。

3. 接下来才是重点,通过代码的方式为上述两个按钮设置单击事件。

我们设计出该对话框后是要在多处使用的,在不同的场景下呈现的文字可能不一样,同时单击OK按钮与Cancel可能需要进行不同的处理(即多态性)。下面开始进行代码修改:

打开containerdialog.hpp文件,声明一个共有的联合体(联合体具有两个成员,一个表示OK按钮按下,一个表示Cancel按钮按下),两个共有函数,一个是设置显示的文本,一个是用于设置按钮回调函数
 

public:
    typedef enum { OK, CANCEL } Answer;
    void setText(touchgfx::TypedTextId textId);
    void setAnsweredCallback(touchgfx::GenericCallback<Answer>& callback);

在protected下添加如下函数与变量

定义一个touchgfx::GenericCallback<Answer>* 类型的指针,该指针最终指向Ok与Cancel的回调函数。

定义一个touchgfx::Callback<ContainerDialog, const touchgfx::AbstractButton&>对象,该对象用于绑定OK与Cancel按钮与buttonClicked函数

protected:
    touchgfx::GenericCallback<Answer>* callback;
    touchgfx::Callback<ContainerDialog, const touchgfx::AbstractButton&> onButtonClicked;
    void buttonClicked(const touchgfx::AbstractButton& btn);

打开containerdialog.cpp函数,修改后的文件如下所示:

#include <gui/containers/ContainerDialog.hpp>

ContainerDialog::ContainerDialog():
    onButtonClicked(this, &ContainerDialog::buttonClicked)//绑定回调函数
{
    
}

void ContainerDialog::initialize()
{
    ContainerDialogBase::initialize();
}
//设置显示的文本
void ContainerDialog::setText(touchgfx::TypedTextId textId)
{
    textArea1.setTypedText(touchgfx::TypedText(textId));
    textArea1.setPosition(0, 50, 240, textArea1.getTextHeight());
    invalidate();
}
//设置回调函数
void ContainerDialog::setAnsweredCallback(touchgfx::GenericCallback<Answer>& callback)
{
    this->callback = &callback;
}
//当按钮按下时,会调用该函数
void ContainerDialog::buttonClicked(const touchgfx::AbstractButton& btn)
{
    //--------------------------------------
    //    您也可以在次数添加一些处理
    //--------------------------------------

    if (callback && callback->isValid())//判断回调函数是否为空
    {
        //调用设置的回调函数
        callback->execute(&btn == &buttonOk ? ContainerDialog::OK : ContainerDialog::CANCEL);
    }
}

4  自定义对话框已经完成,接下来使用该对话框

打开Screen1View.hpp,进行如下修改:

添加头文件:

#include <gui/containers/ContainerDialog.hpp>

protected属性下添加:

protected:
    ContainerDialog   containerDialog;
    Callback<Screen1View, ContainerDialog::Answer> onDialogAnswered;
    void dialogAnswered(ContainerDialog::Answer answer);

打开Screen1View.cpp,进行如下修改,这里就只贴修改的部分了:

Screen1View::Screen1View():
          onDialogAnswered(this, &Screen1View::dialogAnswered)
{

}


void Screen1View::setupScreen()
{
    // 在创建该屏幕的时候,显示对话框
    containerDialog.setXY(HAL::DISPLAY_WIDTH / 2 - containerDialog.getWidth() / 2, HAL::DISPLAY_HEIGHT / 2 - containerDialog.getHeight() / 2);
    containerDialog.setText(T_DIALOGMSG);
    containerDialog.setAnsweredCallback(onDialogAnswered);
    add(containerDialog);
}

//当从对话框退出时,会调用该回调函数,参数指示了是点击了OK按钮还是Cancel按钮
void Screen1View::modalAnswered(ModalDialog::Answer answer)
{
    containerDialog.setVisible(false);
    containerDialog.invalidate();
}

总结: 

      本文的重点是学会使用回调函数实现对话框的多态性。学会了该知识点,要实现键盘就简单不少了,只是界面布局不一样,然后按钮多点。
      当然我们如果仔细看官方手册的话,会发现有一个ModalWindow类(对应TouchGFX 的ModalWindow空间),使用该类可以非常简单的实现对话框功能;
     同时也有一个Keyboard类,专门用于实现键盘功能,这个看官方的例子就行了。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TouchGFX使用自定义容器实现对话框、虚拟键盘等功能 的相关文章

  • failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request

    问题描述 failed to solve with frontend dockerfile v0 failed to create LLB definition failed to span class token keyword do s
  • LeTeX 快速入门

    LeTeX 快速入门官方链接 什么是LeTeX LaTeX是一种用于排版专业外观文档的工具 然而 xff0c LaTeX的操作模式与您可能使用过的许多其他文档制作应用程序 xff08 如Microsoft Word或LibreOffice
  • 医学图像挑战

    标题标签不平衡挑战 方法一 xff1a 二元交叉熵损失函数 方法二 xff1a 重新采用达到类别平衡 过采样 欠采样 多任务挑战 设置不同任务的损失函数 数据集大小挑战 迁移学习 神经网络的早期层捕获可归一化的低级图像特征 xff08 图像
  • 医学图像数据集的挑战

    患者数据重叠 xff1a 当患者存在多个不同数据时划分数据集应避免随机划分 xff0c 避免同一个患者的数据出现在训练集 xff0c 验证集 xff0c 测试集 使用按患者划分数据集根据合理 集采用 xff1a 测试集或者验证出现数据不平衡
  • Ubuntu 查看磁盘空间大小命令

    http blog sina com cn s blog 6432901c0100w0tz html Df命令是linux系统以磁盘分区为单位查看文件系统 xff0c 可以加上参数查看磁盘剩余空间信息 xff0c 命令格式 xff1a df
  • 蜂鸣器发声音频率

    蜂鸣器发声音频率 蜂鸣器发声音频率 1 200Hz声音很小 200 300有声音 400嘟 500滴 600音调变高 700音调变高 800音调变高 2730Hz适合做滴的一声 3000最剌耳 声音大 转载 http blog ednchi
  • 应对不明确的项目需求

    今天在Javaeye上看到一个抱怨客户的无底洞需求时 xff0c 一个网友的回复 xff0c 觉得不错 xff0c 对以后自己接项目做个警示 xff1a From http www javaeye com topic 180477 61 6
  • 基于51单片机的波形发生器(四种波形)(毕业设计资料)

    四种波形的产生 xff0c 包括锯齿波 三角波 方波 正弦波 通过LCD液晶显示当前波形以及波形的频率 可以通过按键切换波形 xff0c 并可以通过按键进行设置当前波形的频率大小 xff0c 也可以设置频率设置不步进值 资料从主页链接中进行

随机推荐