所以我有一个按钮,如下所示。
(define square
(new button%
[parent frame]
[label ""]
[min-width 300]
[min-height 300]
[font (make-object font% 110 'default 'normal 'bold)]))
单击按钮时标签会更新,我想知道是否可以为此目的更改文本的颜色。如果这不是一个选项,那么能够改变按钮的颜色也会使我受益。
答案 0 :(得分:1)
是的,是的,这是可能的,但图书馆并没有开箱即用。幸运的是,这是Racket,所以我们可以轻松地创建自己的(更容易)抽象。我会切换到贵妃并向你展示它。它是一个colorerable-button%
类,与button%
类似,但它有一个color
参数和set-color
字段:
(define text-size-dc
(new bitmap-dc% [bitmap (make-object bitmap% 1 1)]))
(define colorable-button%
(class button%
(init [(internal-label label)]
[(initial-color color) "black"]
[(internal-font font) normal-control-font])
(define label internal-label)
(define font internal-font)
(super-new [label (make-label label font initial-color)]
[font font])
(define/override (set-label l)
(set! label l)
(super set-label l))
(define/private (make-label label font color)
(cond
[(string? label)
(match-define-values (w h _ _)
(send text-size-dc get-text-extent label font))
(define new-label (make-object bitmap% (exact-ceiling w) (exact-ceiling h)))
(define dc (new bitmap-dc% [bitmap new-label]))
(send dc set-font font)
(send dc set-text-foreground color)
(send dc draw-text label 0 0)
new-label]
[else label]))
(define/public (set-color c)
(define new-label (make-label label font c))
(super set-label new-label))))
我们可以使用这个类来制作一个按钮,说明"你好"并在用户点击它时变为红色:
(define f (new frame% [label "HI"]))
(new colorable-button% [parent f]
[label "hello"]
[callback (λ (this event)
(send this set-color "red"))])
(send f show #t)
这种复杂性源于button%
的标签api。它可以接受字符串或bitmap%
。不幸的是,字符串不是很灵活,但bitmap%
字符串更灵活。因此,这种新类型的按钮会抓取其给定的字符串(如果给定一个而不是bitmap%
),并手动将其转换为bitmap%
。这使该类能够手动设置文本的颜色,甚至可以动态地更改它。
整个text-size-dc
只是用dc<%>
api来弥补一些不幸的决定。也就是说,为了获得文本的范围,我们需要创建一个dc<%>
对象,但是在我们获得大小之前,我们不知道它应该具有多少bitmap%
。所以我们只创建一个1像素dc<%>
对象,它只是为了获得文本所需的大小而存在。