Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
求助:如何使用view的句柄函数
发布于 2012-06-11 14:02:46 浏览:3190
订阅该版
在一个workbench上建立三个view,每个view都建立自己的事件处理句柄函数(目前先做按键事件),希望按键可以在不同的view上进行不同的操作。当monitor_view_event_handler句柄函数的键盘事件在demo_workbench_event_handler句柄函数中时是可以正常执行的;而当建立view的句柄函数后就只能执行一次按键事件后就不再进入句柄函数(change view按键依然有效),无法实现正常的按键事件功能,请问如何才能实现按键在不同的句柄函数中的不同操作(相同按键在不同view中可以实现不同的功能)? 另外,请助一下关于在句柄函数中return RT_FALSE的用法:当保留demo_workbench_event_handler句柄函数中的return RT_FALSE或return RT_TRUE时会造成view句柄函数一次按键事件也不能正常执行;而是否保留monitor_view_event_handler句柄函数中的return RT_FALSE和return RT_TRUE对代码现状没有改变,请问是否当view句柄函数增加多个时会有影响,是否可以像文档中所说的向下一个view继续进行处理?求助关于return RT_FALSE与return RT_TRUE在句柄处理函数中的用法。 最后,后续还需在view句柄函数中实现绘图事件,是否在相应句柄函数中用if语句判断增加PAINT事件即可实现,多个view中实现不同PAINT事件是否可能?请给予指导,谢谢! 下为几个主要函数的代码: static rt_bool_t demo_workbench_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) { // 我们目前只对按键事件感兴趣。如果当前workbench处于模式显示状态,忽略它 if((event->type==RTGUI_EVENT_KBD) && !RTGUI_WORKBENCH_IS_MODAL_MODE(RTGUI_WORKBENCH(widget))) { struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; if (ekbd->type == RTGUI_KEYDOWN) { switch(ekbd->key) { /* case RTGUIK_UP: //焦点控件向上移动 chn_focused_row_pre(); rtgui_widget_focus(RTGUI_WIDGET(channel_para[uch_focused_flag].button_name )); break; case RTGUIK_DOWN: //焦点控件向下移动 chn_focused_row_next(); rtgui_widget_focus(RTGUI_WIDGET(channel_para[uch_focused_flag].button_name )); break; case RTGUIK_LEFT: //焦点控件向左移动 chn_focused_pre(); rtgui_widget_focus(RTGUI_WIDGET(channel_para[uch_focused_flag].button_name )); break; case RTGUIK_RIGHT: //焦点控件向右移动 chn_focused_next(); rtgui_widget_focus(RTGUI_WIDGET(channel_para[uch_focused_flag].button_name )); break; //set case RTGUIK_SPACE: //triggle button window rtgui_button_set_onbutton(channel_para[uch_focused_flag].button_name,demo_win_onbutton); //rtgui_widget_focus(RTGUI_WIDGET(win_button[0])); break; */ //change view case RTGUIK_PAGEUP: demo_view_next(RT_NULL, RT_NULL); //break; //return RT_TRUE; //trigger button of autowin case RTGUIK_RETURN: rtgui_button_set_onbutton(channel_para[uch_focused_flag].button_name,demo_autowin_onbutton); // return RT_FALSE; break; default: break; } //return RT_TRUE; } //return RT_FALSE; } // 如果不是按键事件,使用workbench原来的事件处理函数处理 return rtgui_workbench_event_handler(widget, event); } static rt_bool_t monitor_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) { // 目前只对按键事件感兴趣。 if ((event->type == RTGUI_EVENT_KBD)) { struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; if (ekbd->type == RTGUI_KEYDOWN) { switch(ekbd->key) { case RTGUIK_UP: //焦点控件向上移动 chn_focused_row_pre(); rtgui_widget_focus(RTGUI_WIDGET(channel_para[uch_focused_flag].button_name )); break; case RTGUIK_DOWN: //焦点控件向下移动 chn_focused_row_next(); rtgui_widget_focus(RTGUI_WIDGET(channel_para[uch_focused_flag].button_name )); break; case RTGUIK_LEFT: //焦点控件向左移动 chn_focused_pre(); rtgui_widget_focus(RTGUI_WIDGET(channel_para[uch_focused_flag].button_name )); break; case RTGUIK_RIGHT: //焦点控件向右移动 chn_focused_next(); rtgui_widget_focus(RTGUI_WIDGET(channel_para[uch_focused_flag].button_name )); break; case RTGUIK_SPACE: //triggle button window rtgui_button_set_onbutton(channel_para[uch_focused_flag].button_name,demo_win_onbutton); //rtgui_widget_focus(RTGUI_WIDGET(win_button[0])); break; //trigger autowin case RTGUIK_RETURN: rtgui_button_set_onbutton(channel_para[uch_focused_flag].button_name,demo_autowin_onbutton); break; default: break; } //return RT_TRUE; } return RT_FALSE; } // 如果不是键盘事件,使用view原来的事件处理函数处理 return rtgui_view_event_handler(widget, event); } rtgui_view_t* page_monitor_view(rtgui_workbench_t* workbench) { rtgui_rect_t rect; rtgui_view_t* view; rtgui_button_t* button; rt_uint16_t cnt; // 先创建一个演示用的视图 view = creat_page_view(workbench, "防区监控"); // 获得视图的位置信息 demo_view_get_rect(view, &rect); for(cnt=0;cnt<16;cnt++) { rect.x1 = channel_para[cnt].rect.x1; rect.x2 = channel_para[cnt].rect.x2; rect.y1 = channel_para[cnt].rect.y1; rect.y2 = channel_para[cnt].rect.y2; //创建一个button控件 button = rtgui_button_create(channel_para[cnt].chn_text); RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(button)) = channel_para[cnt].text_color; RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(button)) = channel_para[cnt].back_color; //RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(button)) = channel_para[cnt].back_color; //RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(button)) = channel_para[cnt].text_color; //RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(button)) = channel_para[cnt].text_color; //设置button的位置 rtgui_widget_set_rect(RTGUI_WIDGET(button), &rect); // view是一个container控件,调用add_child方法添加这个button控件 rtgui_container_add_child(RTGUI_CONTAINER(view), RTGUI_WIDGET(button)); channel_para[cnt].button_name = button; } //rtgui_widget_focus(RTGUI_WIDGET(channel_para[0].button_name )); return view; } void workbench_entry(void* parameter) { rt_mq_t mq; struct rtgui_workbench* workbench; rtgui_view_t* monitor_view,system_view,record_view; //创建GUI应用需要的消息队列 mq = rt_mq_create("workbench", 32, 32, RT_IPC_FLAG_FIFO); //注册当前线程为GUI线程 rtgui_thread_register(rt_thread_self(), mq); //创建一个工作台 workbench = rtgui_workbench_create("main", "workbench"); if (workbench == RT_NULL) return; //workbench handler 函数 rtgui_widget_set_event_handler(RTGUI_WIDGET(workbench), demo_workbench_event_handler); //监控界面显示 monitor_view = page_monitor_view(workbench); //monitor_view handler 函数 rtgui_widget_set_event_handler(RTGUI_WIDGET(monitor_view),monitor_view_event_handler); /* this view can be focused */ //RTGUI_WIDGET(view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; system_view = page_system_view(workbench); // system_view handler 函数 //rtgui_widget_set_event_handler(RTGUI_WIDGET(system_view),system_view_event_handler); //record_view handler 函数 record_view = page_record_view(workbench); //rtgui_widget_set_event_handler(RTGUI_WIDGET(record_view),record_view_event_handler); // 显示视图 current_view_show(); // 执行工作台事件循环 rtgui_workbench_event_loop(workbench); //去注册GUI线程 rtgui_thread_deregister(rt_thread_self()); rt_mq_delete(mq); }
查看更多
5
个回答
默认排序
按发布时间排序
amsl
2012-06-11
这家伙很懒,什么也没写!
每个view都绑定了event_handler,那么workbench可以不用再自定义event_handler了,事件会由workbench转发到第一个显示的view中,你的应用,可以将切换view也放在每个view的event_handler中处理。 关于返回RT_TRUE还是RT_FALSE,是0.4版中设置的一个特性,这个特性应用于container类型的控件向子控件派发事件过程中。 下面贴出代码: ``` rt_bool_t rtgui_container_dispatch_event(rtgui_container_t *container, rtgui_event_t* event) { /* handle in child widget */ struct rtgui_list_node* node; rtgui_list_foreach(node, &(container->children)) { struct rtgui_widget* w; w = rtgui_list_entry(node, struct rtgui_widget, sibling); if (w->event_handler(w, event) == RT_TRUE) return RT_TRUE; } return RT_FALSE; } ``` 从代码中可以看出,当某个子控件截获了事件并正确处理时,可以返回RT_TRUE,这样就跳出了循环,不再向其它子控件派发该事件了。否则返回RT_FALSE,则继续派发给其他子控件。因为container类型的控件可以嵌套,所以设置了判断返回值是否为RT_TRUE作为退出条件,也就是,不管在哪一层的哪一个子控件,只要返回了RT_TRUE,都可以结束本次的派发过程。 这个问题有很多人问,可以查看RTGUI分析文档第一章,有相关介绍。在wiki下。
captain_xi
2012-06-14
这家伙很懒,什么也没写!
非常感谢amsl老师的热心帮助,特别是关于返回RT_TRUE还是RT_FALSE的解析,同时这个问题也是困扰我在这个应用中的一个重要问题,我也曾一度怀疑是否是这个返回值的问题影响我在应用中执行不到正确的结果;接下来也会仔细研究相关代码,以便后续做好多个view的应用。 关于view的event_handler的函数,您所提的解决方案我也曾试验过,只是问题的根本好像不在workbench中有没有event_handler函数,而是view中的event_handler函数无论如何只能能被执行一次,而不能像workbench中的event_handler一样可以一直被触发和执行;请问是否还需修改rtgui_view_event_handler 函数或rtgui_workbench_event_loop 函数,或有其它解决途径,又或者上述代码存在问题所致? 烦请能再给予指导,也请各位朋友能帮助解决应用。
amsl
2012-06-15
这家伙很懒,什么也没写!
留下你的邮箱。
captain_xi
2012-06-16
这家伙很懒,什么也没写!
captain.xi@Gmail.com
,谢谢amsl
撰写答案
登录
注册新账号
关注者
0
被浏览
3.2k
关于作者
captain_xi
这家伙很懒,什么也没写!
提问
1
回答
2
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
EtherKit快速上手PROFINET
2
RTThread USB转串口无法接收数据
3
HC32F4A0 SD卡挂载及热插拔的实现
4
vscode插件 - RT-Thread Studio项目助手 | 跨平台开发
5
Console串口使用说明
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部