我正在评估除了STM32 32平台之外的TouchGFX工具。一切都“很好”,就像STM32F746G-Discoveryboard与一些硬件资源的交互一样,但还有另一个问题。
我创建了一个自定义键盘(如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_HPPScreen3View.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_HPPScreen4View.cpp
Screen4View::Screen4View()
{
}所有other.cpp的TouchGFX文件“说”完全一样的事情。仅屏幕3应该有这个键盘,而不是屏幕4太。
所以,如果有人知道为什么会这样,请回答。:)
非常感谢。
发布于 2019-11-14 13:01:07
当您在TouchGFX应用程序中“切换屏幕”时,这个新帧将呈现到某些帧缓冲区内存中(在解释所看到的内容时,运行模拟器与具有多个帧缓冲区的目标硬件的复杂性是无关的)。
当您激活一个不呈现任何内容的屏幕时(比如Screen4,因为它没有小部件),基本上是盯着前一个框架(即带有键盘的Screen3 )留下的帧缓冲区的状态。想象一下,如果Screen4是您尝试呈现的第一件事,那么您只会看到垃圾/未初始化的内存。
这就是为什么你会看到一个键盘,即使它甚至不是Screen4的一部分。向Screen4添加一个方框,覆盖画布的全部维度,您就不会再看到以前的framebuffer状态了。这对于任何小部件来说都是一样的。
如果你把液晶显示器的玻璃和你房子里的窗户做比较,通过添加一个盒子,你基本上就是关闭了那个窗口的百叶窗,现在不能看到另一边的“键盘”了。
发布于 2020-04-12 11:28:42
Zrr字节的回答很好地解释了为什么要面对OP所面临的问题。给出的解决方案(强制在屏幕上显示背景图像)可以工作,但另一种解决方案是用某种颜色填充帧缓冲区。对于STM32F746G-迪斯科,您可以这样做:
Screen4View::Screen4View()
{
HAL::getInstance()->blitFill(0, 0, 0, 480, 272, 255);
}这基本上会迫使整个液晶显示器充满黑色。
此函数的原型在HAL.cpp中:
virtual void blitFill(colortype color, uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t alpha);实际上,无论您使用zrr字节的解决方案还是使用我的解决方案,都不会有太大的区别--这两种解决方案的性能是相似的。
https://stackoverflow.com/questions/58854742
复制相似问题