【问题标题】:How to change the color of text in a racket gui button如何更改球拍 gui 按钮中文本的颜色
【发布时间】:2018-07-03 00:27:39
【问题描述】:

所以我有一个如下所示的按钮。

(define square
(new button%
   [parent frame]
   [label ""]
   [min-width 300]
   [min-height 300]
   [font (make-object font% 110 'default 'normal 'bold)]))

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

【问题讨论】:

    标签: button text colors styles racket


    【解决方案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<%> 对象,该对象的存在只是为了获得文本所需的大小。

    【讨论】:

    • 那么如果有一个 colorable-button% 类,这是否意味着还有诸如 colorable-frame%、colorable-panel% 之类的东西可以让我设置背景颜色?
    • 那就太好了。看起来当前的 frame% 类不允许您轻松做到这一点,您最终需要使用 canvas%。理论上你可以使用 snip% api,但是它很笨重。我目前正在努力解决这个疏忽,但这需要一些时间。 ://
    • 任何了解如何为框架制作背景颜色,同时能够保持 GUI 元素(如按钮)覆盖在顶部会很棒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多