TouchGFX 小部件在空白屏幕上可见

TouchGFX widget visible on empty screen

我正在评估除 STM32 平台之外的 TouchGFX 工具。 一切正常"fine",比如与STM32F746G-Discovery板的一些硬件资源交互,但还有一个问题

我创建了一个自定义键盘(如 TouchGFX 示例中所示),但甚至在我进入最后一个屏幕之前,它应该是可见的,它之前出现在屏幕上。 我检查了两个屏幕的 View.hpp/.cpp 和 ViewBase.hpp/.cpp ,我不知道为什么会这样。

屏幕 3View.hpp(键盘应该可见的位置)

#ifndef SCREEN3VIEW_HPP
#define SCREEN3VIEW_HPP

#include <gui_generated/screen3_screen/Screen3ViewBase.hpp>
#include <gui/screen3_screen/Screen3Presenter.hpp>
#include <gui_generated/screen3_screen/Screen3ViewBase.hpp>
#include <gui/screen3_screen/Screen3Presenter.hpp>
#include <gui/common/CustomKeyboard.hpp>
#include <touchgfx/widgets/ButtonWithLabel.hpp>

class Screen3View : public Screen3ViewBase
{
public:
    Screen3View();
    virtual ~Screen3View() {}
    virtual void setupScreen();
    virtual void tearDownScreen();
protected:

    CustomKeyboard keyboard;

};

#endif // SCREEN3VIEW_HPP

Screen3View.cpp

Screen3View::Screen3View()
{
    keyboard.setPosition(16, 16, 400, 240);
    add(keyboard);
}

Screen4View.hpp(键盘应该可见)

#ifndef SCREEN4VIEW_HPP
#define SCREEN4VIEW_HPP

#include <gui_generated/screen4_screen/Screen4ViewBase.hpp>
#include <gui/screen4_screen/Screen4Presenter.hpp>

class Screen4View : public Screen4ViewBase
{
public:
    Screen4View();
    virtual ~Screen4View() {}
    virtual void setupScreen();
    virtual void tearDownScreen();
protected:
};

#endif // SCREEN4VIEW_HPP

Screen4View.cpp

Screen4View::Screen4View()
{

}

所有 other.cpp TouchGFX 文件 "say" 完全相同。 只有屏幕 3 应该有这个键盘,而屏幕 4 也没有。

因此,如果有人知道为什么会这样,请回答。 :)

非常感谢。

当你在 TouchGFX 应用程序中 "switch screens" 时,这个新帧将被渲染到一些帧缓冲区内存(运行 模拟器与具有多个帧缓冲区的目标硬件的复杂性在解释时无关紧要你看到了什么)。

当您激活一个不呈现任何内容的屏幕(如 Screen4,因为它没有小部件)时,您基本上是在盯着前一帧(即带有键盘的 Screen3)留下的帧缓冲区的状态。想象一下,如果 Screen4 是您尝试渲染的第一个东西 - 那么您只会看到 garbage/uninitialized 内存。

这就是您看到键盘的原因,即使它甚至不是 Screen4 的一部分。向 Screen4 添加一个框,覆盖 canvas 的整个尺寸,您将不会再看到之前的帧缓冲区状态。这对于任何小部件都是一样的。

如果您将 LCD 的玻璃与您家中的 window 进行比较,通过添加一个盒子,您基本上是在关闭 window 的百叶窗,现在无法看到 "Keyboard"就在另一边。

zrrbyte 的回答很好地解释了为什么会遇到 OP 所面临的问题。给出的解决方案(强制在屏幕上显示背景图像)有效,但另一种解决方案是用某种颜色填充帧缓冲区。对于 STM32F746G-DISCO,您可以按如下方式进行:

Screen4View::Screen4View()
{
    HAL::getInstance()->blitFill(0, 0, 0, 480, 272, 255);
}

这基本上会强制整个 LCD 填充黑色。


这个函数的原型在HAL.cpp:

virtual void blitFill(colortype color, uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t alpha);


实际上,无论您使用 zrrbyte 的解决方案还是我的解决方案,都不会有太大区别 - 两种解决方案的性能相似。