Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
关于RTGUI 的多个Model Windosw的疑问
发布于 2012-08-03 17:23:31 浏览:3965
订阅该版
当我采Model模式显示第一个Windows的时候,能够正常显示,但当我在这个Windows基础上再Model第二个Windows的时候,会出现底层的刷新把最底层的控件刷新掉。。。- -这个很不解,希望指教。 ![WP_000233.jpg](/uploads/2052_ff0bc287a1356c44f7af308cb692a44c.jpg) ![WP_000234.jpg](/uploads/2052_1cf9c81d84b8f83dfdfa482de2279626.jpg) ![WP_000235.jpg](/uploads/2052_406a44a2ffb3e1d2632bd675ed51233f.jpg)
查看更多
9
个回答
默认排序
按发布时间排序
rtt-fans
2012-08-03
这家伙很懒,什么也没写!
因为第二层模态窗口也自动退出了。 可以看一下结束模态窗口的代码: ``` void rtgui_win_end_modal(struct rtgui_win* win, rtgui_modal_code_t modal_code) { if (win->parent_toplevel != RT_NULL) { if (RTGUI_IS_WORKBENCH(win->parent_toplevel)) { ... workbench->flag &= ~RTGUI_WORKBENCH_FLAG_MODAL_MODE; } else if (RTGUI_IS_WIN(win->parent_toplevel)) { ... parent_win->style &= ~RTGUI_WIN_STYLE_UNDER_MODAL; } } else { ... } ... } ``` 当模态的标志一复位,整个父对象或者workbenck的标志就复位了,所以第二个窗口退出到第一个窗口的函数内部时第一个窗口的父对象的模态标志也就复位了,第一个也退出了.这两个窗口是共用的同一个workbench
rtt-fans
2012-08-03
这家伙很懒,什么也没写!
当然模态的view也会有这个问题。呵呵 解决办法是: ``` win = rtgui_win_create(); rtgui_win_show(win,RT_TRUE); //模态 //得确保内部会触发第二个窗口,当这里返回后,win的内部控件并未释放 //所有可以再次调用。 rtgui_win_show(win,RT_TRUE); //模态 //或者加个while()循环吧,判断退出标志。 while(1) { rtgui_win_show(win,RT_TRUE); if(flag) break; //flag是个判断的标志位 } ```
bernard
2012-08-03
这家伙很懒,什么也没写!
还不知道新的GUI是否会有这类问题呢,modal类型窗口处理起来是挺麻烦的。
grissiom
2012-08-03
这家伙很懒,什么也没写!
不是很明白 LZ 遇到的问题,貌似是第二层模态窗口退出会导致第一层模态窗口的退出? 如果是这样,在新的 RTGUI 里应该不会出现这个 bug,新 RTGUI 里用的是引用计数的方式,事件循环是一层一层退出的。
xiao苦
2012-08-04
这家伙很懒,什么也没写!
呃, 你们搞错了、不是这样的, 我碰到的问题是,当我Model第二个Windows的时候,发现底层的控件会无视第二个Windows的区域继续刷新,导致第二个windows显示错误。 此外 ,关于你们的Model,在老的GUI,我是采用另外一种方法解决的、 if (RTGUI_IS_WORKBENCH(parent_widget)) { rtgui_workbench_t* workbench; workbench = RTGUI_WORKBENCH(win->parent_toplevel); workbench->flag |= RTGUI_WORKBENCH_FLAG_MODAL_MODE; workbench->modal_widget = RTGUI_WIDGET(win); rtgui_workbench_event_loop(workbench); result = workbench->modal_code; workbench->flag &= ~RTGUI_WORKBENCH_FLAG_MODAL_MODE; workbench->modal_widget = RT_NULL; } else if (RTGUI_IS_WIN(parent_widget)) { rtgui_win_t* parent_win; parent_win = RTGUI_WIN(win->parent_toplevel); parent_win->style |= RTGUI_WIN_STYLE_UNDER_MODAL; parent_win->modal_widget = RTGUI_WIDGET(win); //parent_win->parent_toplevel = RTGUI_TOPLEVEL(win); //rtgui_widget_update_clip(RTGUI_WIDGET(win)); rtgui_win_event_loop(parent_win); result = parent_win->modal_code; parent_win->style &= ~RTGUI_WIN_STYLE_UNDER_MODAL; parent_win->modal_widget = RT_NULL; } 事先声明,我这样改是因为我的第二个窗口是在Windows的控件上建立的,它的Parent是第一个Windows,所以这样改之后。 void rtgui_win_event_loop(rtgui_win_t* wnd) { rt_err_t result; rtgui_thread_t* tid; struct rtgui_event* event; rtgui_widget_t * widget; tid = rtgui_thread_self(); RT_ASSERT(tid != RT_NULL); widget = wnd->modal_widget; /* point to event buffer */ event = (struct rtgui_event*)tid->event_buffer; if (wnd->style & RTGUI_WIN_STYLE_UNDER_MODAL) { while (wnd->style & RTGUI_WIN_STYLE_UNDER_MODAL) { if (tid->on_idle != RT_NULL) { result = rtgui_thread_recv_nosuspend(event, RTGUI_EVENT_BUFFER_SIZE); if (result == RT_EOK) { /* perform event handler */ //自己添加的, 为的事将事件直接传递给上一层控件 if ((widget != RT_NULL) && (widget->event_handler != RT_NULL)) { widget->event_handler(widget, event); } //RTGUI_WIDGET(wnd)->event_handler(RTGUI_WIDGET(wnd), event); } else if (result == -RT_ETIMEOUT) { tid->on_idle(RTGUI_WIDGET(wnd), RT_NULL); } } else { result = rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE); if (result == RT_EOK) { /* perform event handler */ //自己添加的, 为的事将事件直接传递给上一层控件 if ((widget != RT_NULL) && (widget->event_handler != RT_NULL)) { widget->event_handler(widget, event); } //RTGUI_WIDGET(wnd)->event_handler(RTGUI_WIDGET(wnd), event); } } } } else { while (!(wnd->style & RTGUI_WIN_STYLE_CLOSED)) { if (tid->on_idle != RT_NULL) { result = rtgui_thread_recv_nosuspend(event, RTGUI_EVENT_BUFFER_SIZE); if (result == RT_EOK) { /* perform event handler */ RTGUI_WIDGET(wnd)->event_handler(RTGUI_WIDGET(wnd), event); } else if (result == -RT_ETIMEOUT) { tid->on_idle(RTGUI_WIDGET(wnd), RT_NULL); } } else { result = rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE); if (result == RT_EOK) { /* perform event handler */ RTGUI_WIDGET(wnd)->event_handler(RTGUI_WIDGET(wnd), event); } } } } /* destroy window */ //rtgui_widget_destroy(RTGUI_WIDGET(wnd)); } 这样的话,就能实现Model显示下,只要上当前Windows基础上创建ModelWindows, 第二个Windows都不会出现把前一个Window退出的现象,因为它有个先后顺序,事件只会传递给最上层Windows,当前Windows退出后会自动转到前一个Windows继续运行。
咖啡恋
2012-08-10
这家伙很懒,什么也没写!
楼主,你好,你上的图是实物图还是模拟图?如果是模拟的,用的什么软件?我找了很久都没找到模拟软件
xiao苦
2012-08-14
这家伙很懒,什么也没写!
- -...明显是实物。。。
咖啡恋
2012-08-14
这家伙很懒,什么也没写!
有谁有仿真的软件和操作方法啊?
撰写答案
登录
注册新账号
关注者
0
被浏览
4k
关于作者
xiao苦
这家伙很懒,什么也没写!
提问
57
回答
244
被采纳
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
rt-thread 小内存算法源码分析
2
env中添加lvgl软件包后,keil编译包--c99错误
3
【NXP-MCXA153】 定时器驱动移植
4
GD32F450 看门狗驱动适配
5
【NXP-MCXA153】看门狗驱动移植
热门标签
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在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
红枫
8
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
11
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部