C++ 触摸GFX小部件在空屏幕上可见

C++ 触摸GFX小部件在空屏幕上可见,c++,stm32,touchscreen,stm32f7,C++,Stm32,Touchscreen,Stm32f7,我正在评估STM32平台之外的TouchGFX工具。 一切正常,比如与STM32F746G发现板的一些硬件资源的交互,但还有另一个问题 我创建了一个自定义键盘(如TouchGFX示例中所示),但即使在我进入最后一个屏幕之前,它也会显示在屏幕上。 我检查了两个屏幕的View.hpp/.cpp和ViewBase.hpp/.cpp,我不知道为什么会这样 Screen3View.hpp(键盘应可见的位置) Screen4View.hpp(其中键盘应不可见) TouchGFX文件的所有其他.cpp都“说”

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

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

Screen3View.hpp(键盘应可见的位置)

Screen4View.hpp(其中键盘应不可见)

TouchGFX文件的所有其他.cpp都“说”了完全相同的内容。 只有屏幕3应该有这个键盘,而不是屏幕4太

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

多谢各位

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

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

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

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

当您在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的解决方案还是我的解决方案都没有多大区别——两种解决方案的性能是相似的。

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

谢谢您的回答。我用TouchGFX设计器创建了画布,并添加了按钮、框等。解决了上述问题(ScreenviewBase.cpp看起来不错)。是否需要在Screen4View.cpp/.hpp中手动添加框?完全正确。为了不查看前一帧的帧缓冲区状态,您必须在所有屏幕定义中覆盖整个画布,或者按框(单色)或者图片。不客气!如果你发布更多与TouchGFX相关的问题,请点击我。你太好了。我还有另外一个问题。如果你能帮助我…:)谢谢你的回答。我已经用TouchGFX设计器创建了画布,并添加了按钮、框等。它解决了上述问题(ScreenviewBase.cpp看起来不错)。是否需要在Screen4View.cpp/.hpp中手动添加框?完全正确。为了不查看前一帧的帧缓冲区状态,您必须在所有屏幕定义中覆盖整个画布,或者按框(单色)或者图像。不客气!如果你发布更多与TouchGFX相关的问题,请点击我。你真是太好了。我还有另外一个问题。如果你能帮我…:)这是一个很好的观察结果-添加一个框也会简单地用一些颜色调用blitFill(),但会带来内存开销,在视图中有一个额外的框对象。这是一种边缘情况,但是如果您的内存非常有限,并且您有一个需要单色背景的简单应用程序,那么这是一种很好的方法。这是一个很好的观察结果-添加一个长方体也可以简单地调用带有某种颜色的blitFill(),但会带来内存开销,在视图中有一个额外的长方体对象。这是一种边缘情况,但如果您的内存非常有限,并且您有一个需要单色背景的简单应用程序,那么这是一种很好的方法。
Screen4View::Screen4View()
{
    HAL::getInstance()->blitFill(0, 0, 0, 480, 272, 255);
}
virtual void blitFill(colortype color, uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t alpha);