模式对话框,在Racket / GUI中禁用其父级菜单栏?

时间:2012-04-04 16:05:24

标签: user-interface racket

  1. 使用racket gui库,我发现我无法使用真正的模态对话框,当它显示时,无法激活其父窗口。
  2. 虽然对话框将阻止其父级的事件空间,但可以单击父窗口中的菜单栏,从而可以反复显示相同的对话框。以下是代码:
  3. #lang racket/gui

    (define frame (new frame%
                       [label "test"]
                       [width 200]
                       [height 200]))
    
    (define mb (new menu-bar% [parent frame]))
    
    (let ([m (new menu% 
                  [parent mb]
                  [label "&About"])])
      (new menu-item%
           [parent m]
           [label "&About"]
           [callback (lambda (b e) (message-box "About" "This is a test." frame))])
      )
    
    
    (send frame show #t)
    

    (p.s消息框可以弹出一个对话框 - 与(new dialog% [parent frame])相同)

    因此,如果我们忽略第一个问题,我们是否可以显示禁用父菜单栏的模态对话框?

    此外,是否真的不可能在racket / gui中创建一个真实的模态对话框?

    (我正在研究Win7)

3 个答案:

答案 0 :(得分:2)

我认为你不想使用frame%,而是想在这里使用dialog%课程。我不确定你是否可以轻松制作一个有菜单栏的模态对话框。

哦,还要记住,dialog%只是其事件空间的模态。因此,如果您从DrRacket运行创建对话框的代码片段,则DrRacket本身仍然可以访问。

答案 1 :(得分:2)

答案 2 :(得分:0)

这看起来有点像hackish,但你可以自己使用[callback (lambda (b e) (send mb enable #f) (message-box "About" "This is a test.") (send mb enable #t))]或者如果涉及延续,可以使用dynamic-wind,在你的例子中它们不是。