用Racket做一个拼图游戏——24 创建命令功能区

78 篇文章 16 订阅
28 篇文章 0 订阅

24 创建命令功能区

先看代码。再作解释:

;创建命令功能区:
(define (create-command-area p)
  (let ([vp (new vertical-panel%
                 [parent p]
                 [alignment '(center top)])])
    ;创建行列设置组:
    (create-row&col-set-group vp)
    ;创建拼图命令按钮组:
    (create-puzzle-command-button-group vp)
    (set! button/exit
          (new button%
               [label "退出"]
               [parent vp]
               [callback button/exit-callback]))))

这里同样使用了竖向面板。除了利用两个函数建立两个视图区外,最后还定义了一个按钮类button%对象。

24.1 定义按钮构件

按钮类button%对象创建一个带有字符串标签、位图标签或两者的按钮。每当一个按钮被用户点击时,该按钮的回调过程就会被调用。 当每个按钮被创建时,一个回调过程被作为初始化参数提供。

button%的属性有:label、parent、callback、style、font、enabled、vert-margin、horiz-margin、min-width、min-height、stretchable-width、stretchable-height。

label属性既可以是字符串值,也可以是图片类(bitmap%)对象实例值,也可以是二者兼有。

style属性的值是以下符号值的列表:

  • ’border:按钮会被画上一个特殊的边框, 向用户表明它是默认的动作按钮。

  • ’multi-line:按钮会以一种可以垂直伸展的方式绘制,并适应文本标签中的多行。 目前,这种样式只在 Mac OS 上有区别, 当 label 是一个包含 #\newline 或 #\return 的字符串时,它会被自动选择。

  • ’deleted:按钮被创建为隐藏的,它不会影响其父级的几何形状;可以通过调用 parent 的 add-child方法,在以后变成活动的。

24.2 定义按钮回调函数

button/exit按钮实例是为用户在退出游戏时准备的。用户想退出游戏时,点击该按钮,向主框架窗口发送一个退出消息,程序直接退出。这个按钮的回调函数比较简单,这里直接写好,也方便程序调试时可以正常退出程序。如下:

;退出按钮响应函数:
(define (button/exit-callback control event)
  (send main-frame on-exit))

对于这种内容很少的回调函数,也可以用匿名回调函数直接将函数体内容放到按钮的定义中去。这样:

;创建命令功能区:
(define (create-command-area p)
  (let ([vp (new vertical-panel%
                 [parent p]
                 [alignment '(center top)])])
    ;创建行列设置组:
    (create-row&col-set-group vp)
    ;创建拼图命令按钮组:
    (create-puzzle-command-button-group vp)
    (set! button/exit
          (new button%
               [label "退出"]
               [parent vp]
               [callback
                (lambda (control event)
                  (send main-frame on-exit))]))))

不过考虑到程序功能的扩展,比如以后可能在退出前做一些善后工作,将回调函数单独定义会更好些,可以减少程序重构的麻烦。

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值