使用窗口管理器
A 窗口管理器 是一个组件,它自动将消息(如鼠标单击和按键)分发到多个事件处理程序之一。

初始窗口
首先我们的常规设置:
include "gui/__init__";
open FlxGui;
println$ "Basic Window Controller Test";
FlxGui::init();
var font_name = dflt_sans_serif_font();
var font : font_t = get_font(font_name, 12);
var lineskip = get_lineskip font;
现在,我们制作两个相似的窗口,位置不同,标题不同。
var w1 = create_resizable_window("Felix:gui_05_window_controller_01",100,100,400,400);
w1.add$ mk_drawable FlxGui::clear lightgrey;
w1.add$ mk_drawable FlxGui::write (100,100,font,black,"Basic Window Controller Test#1");
w1.show();
w1.update();
var w2 = create_resizable_window("WINDOW 2",400,100,400,400);
w2.add$ mk_drawable FlxGui::clear blue;
w2.add$ mk_drawable FlxGui::write (100,100,font,black,"Basic Window Controller Test#2");
w2.show();
w2.update();
事件处理程序
和以前一样!
// make an event handler for our window
chip ehandler
(var w:window_t)
connector pins
pin input : %<event_t
{
// get a first event from the window manager
var e: event_t = read pins.input;
// while the event isn't a quit event ..
while e.window.event.SDL_WindowEventID != SDL_WINDOWEVENT_CLOSE do
// print a diagnostic
var s =
match e with
| WINDOWEVENT we =>
we.type.SDL_EventType.str + ": " + we.event.SDL_WindowEventID.str + " wid=" + we.windowID.str
| _ =>
e.type.SDL_EventType.str
;
var linepos = 100 + 4 * lineskip;
if s != "" do
println$ s;
var r = rect_t (100,linepos - 2*lineskip,300,4*lineskip);
w.add$ mk_drawable fill (r, green);
w.add$ mk_drawable FlxGui::write (100,linepos,font,black,"EVENT: "+ s);
w.update();
done
// get another event
e= read pins.input;
done
// we must have got a quit ..
println$ "++++++CLOSE EVENT";
}
窗口管理器
不是为了好玩。首先,我们的主线创建一个窗口管理器对象:
begin
//create a window manager
var wm = window_manager();
现在,我们创建两个窗口控制器。将有窗口管理器的客户端。
// create a window controller for our window
var eh1 = ehandler w1;
var wc1 = window_controller (w1, eh1);
var eh2 = ehandler w2;
var wc2 = window_controller (w2, eh2);
注意,在这种情况下,同一个事件处理程序被绑定到两个不同的窗口,然后一个窗口控制器被绑定到这两个窗口上(同样!)
接下来,我们只需将窗口控制器客户端添加到窗口管理器中。
// attach controller to window manager
var wno1 = wm.add_window wc1;
println$ "Window number " + wno1.str;
var wno2 = wm.add_window wc2;
println$ "Window number " + wno2.str;
当我们这样做时,我们会得到一个窗口编号,由窗口管理器分配,这样我们就可以用窗口管理器理解的方式来引用窗口(尽管我们在这里没有这样做)。
最后:
wm.run_with_timeout 10.0;
println$ "gui05 quitting";
end
我们只需运行窗口管理器,在本例中有一个超时,因为它是一个演示。