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

我正在评估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。

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

非常感谢。

fyplsl 回答:TouchGFX小部件在空白屏幕上可见

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

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

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

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

,

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

Screen4View::Screen4View()
{
    HAL::getInstance()->blitFill(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解决方案都不会有太大区别-两种解决方案的性能都差不多。

本文链接:https://www.f2er.com/3103404.html

大家都在问