Button 如何更改racket gui按钮中文本的颜色
我有一个按钮,如下所示Button 如何更改racket gui按钮中文本的颜色,button,text,colors,styles,racket,Button,Text,Colors,Styles,Racket,我有一个按钮,如下所示 (define square (new button% [parent frame] [label ""] [min-width 300] [min-height 300] [font (make-object font% 110 'default 'normal 'bold)])) 当点击按钮时,标签会更新,我想知道是否有可能为此更改文本的颜色。如果这不是一个选项,那么能够更改按钮的颜色也会让我受益。是的,是的,这是可能的,但库并不能让它
(define square
(new button%
[parent frame]
[label ""]
[min-width 300]
[min-height 300]
[font (make-object font% 110 'default 'normal 'bold)]))
当点击按钮时,标签会更新,我想知道是否有可能为此更改文本的颜色。如果这不是一个选项,那么能够更改按钮的颜色也会让我受益。是的,是的,这是可能的,但库并不能让它变得简单。幸运的是,这是一个复杂的过程,因此我们可以轻松地进行自己的(更容易的)抽象。我会开到马车上给你看。它是一个
colorable 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))))
我们可以使用这个类,比如说,创建一个按钮,当用户单击它时,该按钮会显示“hello”并变为红色:
(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)
这种复杂性源于按钮%
的标签api。它可以接受字符串或位图%
。不幸的是,字符串不是很灵活,但是bitmap%
一个更灵活一些。因此,这种新类型的按钮获取其给定的字符串(如果给定了字符串而不是bitmap%
),并手动将其转换为bitmap%
。这使类能够手动设置文本的颜色,甚至动态更改文本的颜色
整个
文本大小dc
只是为了补偿使用dc
api做出的一些不幸决定。也就是说,为了获得文本的范围,我们需要创建一个dc
对象,但在得到大小之前,我们不知道bitmap%
应该有多少位。因此,我们只需创建一个1像素的dc对象,它的存在只是为了获得文本所需的大小。因此,如果有一个可着色按钮%类,这是否意味着也有一些东西,如可着色框架%,可着色面板%等,允许我设置背景颜色?那将非常好。看起来当前的frame%类不允许您轻松地执行此操作,您最终需要使用canvas%。理论上,您可以使用snip%api,但它很笨重。我目前正在努力纠正这一疏忽,但这需要一些时间/了解如何为一个框架制作背景色,同时能够使GUI元素(如按钮)覆盖在顶部将是非常棒的