我正在评估STM32-Platform之外的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。
因此,如果有人知道为什么会这样,请回答。 :)
非常感谢。
答案 0 :(得分:2)
当您在TouchGFX应用程序中“切换屏幕”时,新帧将呈现到某些帧缓冲内存中(在解释您所看到的内容时,运行模拟器与具有多个帧缓冲区的目标硬件的复杂性无关紧要)。
当激活一个不显示任何内容的屏幕时(如Screen4,因为它没有小部件),您基本上是在盯着上一帧(带有键盘的Screen3)所剩下的帧缓冲区的状态。想象一下,如果Screen4是您要渲染的第一件事-那么您只会看到垃圾/未初始化的内存。
这就是为什么您看到键盘的原因,即使它甚至不是Screen4的一部分。在Screen4中添加一个框,覆盖画布的整个尺寸,您将不再看到以前的帧缓冲区状态。对于任何小部件来说都是一样的。
如果将LCD的玻璃与房屋的窗户进行比较,则通过添加一个框,您基本上是将百叶窗关闭到该窗户上,现在无法看到另一侧的“键盘”。
答案 1 :(得分: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的解决方案还是使用我的zrrbyte解决方案都不会有太大区别-两种解决方案的性能都差不多。