• TouchGFX之自定义控件


    在创建应用时,您可能需要TouchGFX中没有包含的控件。在创建应用时,您可能需要TouchGFX中没有包含的控件。但有时此法并不够用,当您需要全面控制帧缓冲时,您需要使用自定义控件法。

    TouchGFX Designer目前不支持自定义控件的创建。 因此,您将需要手动写入自定义控件的代码,然后在视图的用户代码部分插入控件。

    示例为自定义一个二维码控件

    1. #ifndef QR_CODE_HPP
    2. #define QR_CODE_HPP
    3. #include
    4. class QRCode
    5. {
    6. public:
    7. /* 获取该坐标值 */
    8. bool at(uint16_t x, uint16_t y) const;
    9. /* 获取宽度 */
    10. uint16_t getWidth() const;
    11. /* 获取高度 */
    12. uint16_t getHeight() const;
    13. };
    14. #endif
    1. #include
    2. #include
    3. bool QRCode::at(uint16_t x, uint16_t y) const
    4. {
    5. srand(x*123456+y*getWidth()*23456789);
    6. for(int i = 0; i < 100; i++)
    7. {
    8. srand(rand());
    9. }
    10. return ((rand() / (float)RAND_MAX) > 0.5f);
    11. }
    12. uint16_t QRCode::getWidth() const
    13. {
    14. return 16;
    15. }
    16. uint16_t QRCode::getHeight() const
    17. {
    18. return 16;
    19. }
    1. #ifndef QR_CODE_WIDGET_HPP
    2. #define QR_CODE_WIDGET_HPP
    3. #include
    4. #include
    5. #include
    6. class QRCodeWidget : public touchgfx::Widget
    7. {
    8. public:
    9. QRCodeWidget();
    10. /* 绘制 */
    11. virtual void draw(const touchgfx::Rect& invalidatedArea) const;
    12. /* 获取实心区域 */
    13. virtual touchgfx::Rect getSolidRect() const;
    14. /* 设置二维码成员变量 */
    15. void setQRCode(QRCode *code);
    16. /* 设置缩放比例成员变量 */
    17. void setScale(uint8_t s);
    18. private:
    19. /* 更新二维码控件尺寸 */
    20. void updateSize();
    21. QRCode *code;
    22. uint8_t scale;
    23. };
    24. #endif
    1. #include
    2. #include
    3. QRCodeWidget::QRCodeWidget() :
    4. code(0),
    5. scale(1)
    6. {
    7. }
    8. void QRCodeWidget::setQRCode(QRCode *qrCode)
    9. {
    10. code = qrCode;
    11. updateSize();
    12. }
    13. void QRCodeWidget::draw(const touchgfx::Rect& invalidatedArea) const
    14. {
    15. if(!code)
    16. {
    17. return;
    18. }
    19. touchgfx::Rect absolute = getAbsoluteRect();
    20. uint16_t *framebuffer = touchgfx::HAL::getInstance()->lockFrameBuffer();
    21. for(int y = invalidatedArea.y; y < invalidatedArea.bottom(); y++)
    22. {
    23. for(int x = invalidatedArea.x; x < invalidatedArea.right(); x++)
    24. {
    25. framebuffer[absolute.x + x + (absolute.y + y) * touchgfx::HAL::DISPLAY_WIDTH] = code->at(x / scale, y / scale) ? 0x0000 : 0xffff;
    26. }
    27. }
    28. touchgfx::HAL::getInstance()->unlockFrameBuffer();
    29. }
    30. touchgfx::Rect QRCodeWidget::getSolidRect() const
    31. {
    32. return touchgfx::Rect(0,0,getWidth(), getHeight());
    33. }
    34. void QRCodeWidget::setScale(uint8_t s)
    35. {
    36. scale = s;
    37. updateSize();
    38. }
    39. void QRCodeWidget::updateSize()
    40. {
    41. if(code)
    42. {
    43. setWidth(code->getWidth() * scale);
    44. setHeight(code->getHeight() * scale);
    45. }
    46. }
    1. #include
    2. screenView::screenView()
    3. {
    4. }
    5. void screenView::setupScreen()
    6. {
    7. screenViewBase::setupScreen();
    8. myQRCodeWidget.setScale(10);
    9. myQRCodeWidget.setQRCode(&myQRCode);
    10. add(myQRCodeWidget);
    11. }
    12. void screenView::tearDownScreen()
    13. {
    14. screenViewBase::tearDownScreen();
    15. }

    运行模拟器:显示效果如下

  • 相关阅读:
    (片刻秒懂超级详细)linux的xshell时间同步,时区,年月日CST问题解决
    C#学习记录——网络编程基础
    安全可信 | 首批 天翼云通过可信云安全云工作负载保护平台评估
    关于#c++#的问题:在while(true)添加cout<<"按学号删除学生记录"<<endl
    FloodFill算法---DFS
    内存学习(4):内存分类与常用概念3(ROM)
    React路由与导航
    PA7 The Traveling Salesman Problem
    【问题解决】Linux 安装 opencv 时卡在 IPPICV 包的安装如何解决
    电动汽车对电网的影响(数据+Matlab代码)
  • 原文地址:https://blog.csdn.net/lushoumin/article/details/133095179