1

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

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

Screen3View.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()
{

}

TouchGFX 文件的所有 other.cpp “说” 完全相同的事情。只有屏幕 3 应该有这个键盘,而不是屏幕 4。

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

非常感谢。

4

2 回答 2

3

当您在 TouchGFX 应用程序中“切换屏幕”时,此新帧将被渲染到一些帧缓冲区内存(在解释您所看到的内容时,运行模拟器与具有多个帧缓冲区的目标硬件的复杂性无关)。

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

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

如果您将 LCD 的玻璃与您家中的窗户进行比较,通过添加一个框,您基本上可以关闭该窗户的百叶窗,现在无法看到另一侧的“键盘”。

于 2019-11-14T13:01:07.830 回答
2

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 的解决方案还是我的解决方案,都不会有太大的不同——这两种解决方案的性能是相似的。

于 2020-04-12T11:28:42.487 回答