如何在球拍gui按钮中更改文本的颜色

时间:2018-01-24 03:27:53

标签: 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)]))

单击按钮时标签会更新,我想知道是否可以为此目的更改文本的颜色。如果这不是一个选项,那么能够改变按钮的颜色也会使我受益。

1 个答案:

答案 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<%>对象,它只是为了获得文本所需的大小而存在。