使用窗口管理器

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

_images/gui05.jpeg

初始窗口

首先我们的常规设置:

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

我们只需运行窗口管理器,在本例中有一个超时,因为它是一个演示。