我发现如果view上同时有一个非模态window,和一个模态window时(模态window在非模态上面。非模态的区域包括模态window的区域)。这时候点击非模态window的区域,能active该窗口,deactive模态窗口。但随后,模态窗口会再次active成为顶层显示。这样就造成LCD显示有瞬间切换的的叠影。
我本想在window.c,rtgui_win_event_handler函数修改
。。。。。
case RTGUI_EVENT_WIN_ACTIVATE:
。。。。。加上模态判断
。。。。。
case RTGUI_EVENT_WIN_DEACTIVATE: //屏蔽下面的代码
if (win->style & RTGUI_WIN_STYLE_MODAL)
{
/ do not deactivate a modal win, re-send win-show event /
struct rtgui_event_win_show eshow;
RTGUI_EVENT_WIN_SHOW_INIT(&eshow);
eshow.wid = win;
}
但发现无法运行。问题是执行这个函数时,窗口已经被设置为模态了。
如果ACTIVATE加上模态判断,就无法显示模态窗口,因为是先deactivate再activate的。
敢问版主,该如何解决这个问题呢。
我想其实就是判断用户点击的区域是不是模态窗口的区域,不是就不发送消息了。但是现在的函数好像不是这样写的。它的逻辑是如果有模态窗体,则给模态窗体重发显示消息。
是啊,我也觉得如果是有模态窗口的话,能激活和响应事件的应该只有该模态窗口。但是实际上,目前的GUI不是啊。我昨天试了。有模态窗口的条件下,仍然可以给其他的非模态窗口传递消息。比如在非模态窗口上的checkbox,textbox都可以选择输入。
这个问题其实可以修改workbench.c中的rtgui_workbench_event_handler函数中修复。
比如触摸点击事件
RTGUI_EVENT_MOUSE_BUTTON:
if (top != RT_NULL && RTGUI_WIDGET(top)->event_handler != RT_NULL)
{
/×这里加上×/
if (RTGUI_WORKBENCH_IS_MODAL_MODE(workbench))
。。。。。
else
{
RTGUI_WIDGET(top)->event_handler(RTGUI_WIDGET(top), event);
}
}
但是模态和非模态窗体间的activate 和de-activate还是存在切换叠屏问题,就不知道如何解决了。