分割view窗口不响应onmousewheel_TinyUI(嵌入式UI库)-窗口自定义

TinyUI与传统Windows开发类似,使用窗口(TUIWindow)作为其他UI组件的载体,其设计模式与传统windows、Android等平台开发类似属于MVC设计模式。

但TinyUI作为轻量级的UI库,开发者可以把它与其他第三方UI库一样使用,把一个一个组件通过计算/设置坐标的方式使其展示在屏幕中,即通过调用UI组件的setGeometry()方法设置控件的具体坐标,如果这样使用就失去了TinyUI设计的初衷;因为,如果把一个一个UI组件单独使用而不使用窗口管理,则TinyUI的事件驱动系统将无法正常驱动整个UI系统工作,必然导致使用者难以避免的在硬件/外设中断函数中刷新UI!

作为TinyUI组件容器,其窗口(TUIWindow)控件需为其设置具体的内容视图,内容视图可以是任意布局控件或其他可见UI组件,在TinyUI介绍篇中我们贴出来About窗口部分代码。About部分的代码是把一个GridLayout作为Window的内容视图,本片作为TUIWindow最简单的入门篇,将使用TUITextView作为window的内容视图进行演示。

自定义窗口都必须继承自TinyUI的TUIWindow类,同时该类有2个纯虚方法需要继承者进行实现,关于这2个方法的调用时机及其作为我们将在后续的教程中进行介绍,本篇主要展示TinyUI的TUIWindow的最简单使用方法。

一、自定义窗口

1. 创建名为MyWindow的类

MyWindow.h

#ifndef __MY_WINDOW_H__#define __MY_WINDOW_H__#include class MyWindow : public TUIWindow{public:    MyWindow(TUIWindow* parent = nullptr);    virtual ~MyWindow();    void onShow();    void onClose();private:    TUITextView textView; // 使用TUITextView作为当前窗口的内容视图};#endif // !__MY_WINDOW_H__

2. 实现MyWindow类,并设置内容视图

MyWindow.cpp

#include "MyWindow.h"MyWindow::MyWindow(TUIWindow* parent)    : TUIWindow(parent){    setContentView(&this->textView); // 把textView作为MyWindow的内容视图    textView.setText(L"Window"); // 设置textView显示的文字为"window"}MyWindow::~MyWindow(){}void MyWindow::onShow(){}void MyWindow::onClose(){}

上述内容中,通过setContentView(&this->textView)把textView组件作为MyWindow的内容视图。

到目前为止,自定义窗口的所有工作已全部完成,接下来把自定义窗口放到模拟器中。

二、使用MyWindow窗口

作为入门篇,我们把窗口放到TinyUI的模拟器演示程序,并将其启动。

1. 在演示程序中包含MyWindow的头文件

#include "MyWindow.h"

2. 定义MyWindow窗口及测试按钮

为了让其在模拟器演示程序显示一个测试按钮,我们还需要定义一个按钮,当点击该按钮时显示MyWindow窗口。

TUIButton myWidowTest;MyWindow myTestWindow;

3. 把MyWindow的测试按钮放到模拟器演示程序主界面

myWidowTest.setMargin(5, 5, 5, 5); // 设置按钮外边距myWidowTest.setText(L"My Window"); // 设置按钮显示内容myWidowTest.registerListener(this); // 设置按钮点击事件监听为当前窗口workspaceLayout.addView(&myWidowTest, 2, 5); // 把按钮放到第3行第6列

把MyWindow的测试按钮放到模拟器演示程序的第2行,第5列的为止,并把该按钮显示的内容设置为"My Window",按钮的其他设置暂时不关注,后续我们专题讲解。

到目前为止,我们的模拟器演示程序主界已成功加入了My Widnow的测试项,其最终展示界面如下图所示:

841f546ee78fabba1544f1da15bd05d5.png
980c6560ef96296a5af45aa2c8a5d5c4.gif

​ 上图中,最后一行,最后一列即是我们添加的My Window测试按钮。

4. My Window按钮点击事件

当模拟器演示程序的My Window按钮被点击后,模拟器演示程序窗口的void onClick(TUIButton* view)将会被调用,为什么被调用或如何被调用到,该部分后续详细讲解,属于事件驱动系统部分。

我们在void onClick(TUIButton* view)方法中添加对应的控件id判断,即调用MyWindow的show()方法

void TUILauncher::onClick(TUIButton* view){    uint32_t id = view->getId();    if (myWidowTest.getId() == id) // 被按下的按钮是测试自定义窗口按钮的id    {        myTestWindow.show(); // 显示自定义窗口    }}

至此,整个MyWindow定义和测试代码都已经完成,接下来,我们点击模拟器演示程序的"My Window"按钮

5. 点击"My Window"按钮

当"My Window"按钮被点击后,上述第4步中的onClick()方法被调用,并通过视图控件id判断,条件满足,最后将执行myTestWindow.show()方法,该方法调用完成之后,成功显示了MyWindow的窗口,如下图所示:

c657655db83a283b09e6eba7dbbaf5ed.png
fbebe0fa7a4ea0fc962d28790795e03a.gif

​​我们可以看到MyWindow中的textView也作为自定窗口内容视图,并成功显示了window字样。

6. MyWindow显示事件路由过程

当点击一次模拟器上的My window按钮会产生2次事件,分别为按钮点击事件和窗口显示事件,这里只贴出窗口显示事件路由路径。

>TinyUISimulator.exe!MyWindow::onShow() 行 60C++>TinyUISimulator.exe!TUIWindow::onStartup() 行 48C++>TinyUISimulator.exe!TUIWidgetEventHandler::handleWindowEvent(TUIWindow * window, TUIACTION_WIDGET action, unsigned int eventId, void * param) 行 179C++>TinyUISimulator.exe!TUIWidgetEventHandler::onEvent(TUIACTION_WIDGET action, TUIView * view, unsigned int eventId, void * param) 行 157C++>TinyUISimulator.exe!TUIEventRouter::route(TUIACTION_WIDGET action, TUIView * view, unsigned int eventId, void * param) 行 339C++>TinyUISimulator.exe!TUIEventPumper::handleWidgetEvent() 行 167C++>TinyUISimulator.exe!TUIEventPumper::pumpEvent() 行 67C++>TinyUISimulator.exe!TinyUISimulator::simulatorEventLoop(unsigned int wParam, long lParam) 行 85C++

关于TinyUI最简单的自定义窗口至此已全部完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值