TouchGFX小部件在空屏幕上可见

TouchGFX widget visible on empty screen

本文关键字:屏幕 小部 TouchGFX      更新时间:2023-10-16

我正在评估STM32平台之外的TouchGFX工具。一切都很"好",比如与STM32F746G发现板的一些硬件资源的交互,但还有另一个问题。

我创建了一个自定义键盘(如TouchGFX示例所示(,但即使在我进入最后一个屏幕之前,它也会出现在屏幕上。我检查了两个屏幕的View.hpp/.cpp和ViewBase.hp/.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文件的所有其他.cpp都"说"了完全相同的话。只有屏幕3应该有这个键盘,而不是屏幕4。

所以,如果有人知道为什么会这样,请回答。:(

非常感谢。

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

当你激活一个什么都不渲染的屏幕(就像Screen4,因为它没有小部件(时,你基本上是在盯着前一帧留下的帧缓冲区的状态(这是带有键盘的Screen3(。想象一下,如果Screen4是你试图渲染的第一个东西,那么你只会看到垃圾/未初始化的内存。

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

如果你把液晶显示器的玻璃比作你家的窗户,通过添加一个盒子,你基本上就是在关上窗户的百叶窗,现在就看不到另一边的"键盘"了。

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