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元素(如按钮)覆盖在顶部将是非常棒的