如何更改Racket GUI应用程序中多行文本的颜色?

时间:2012-08-20 21:59:01

标签: user-interface racket

我正在尝试使用Racket's GUI Toolkit,并尝试在屏幕上使用ASCII艺术品进行酷炫的变色效果。我有一个回调颜色,但我似乎无法弄清楚如何调用它来获得适当的结果。

起初我尝试使用message control绘制文本,然后从那里更改文本颜色,但据我所知,无法更改消息的文本颜色。所以我继续使用canvas subwindow,但我似乎无法一次绘制多行文本;新行刚刚删除,ascii艺术作为一长串文本出现。此外,每当窗口调整大小或以其他方式更改时,我用来改变颜色的on-paint回调似乎只会被调用,因此如果用户坐着观看,颜色不会改变。

如果我能找到一种方法来使用画布在每个帧上进行回调,我可以遍历一个文本字符串列表并将每个字符串绘制到屏幕上,垂直分隔以给出换行符的外观,但是我不知道画布是否存在这种“框架内”调用。

有关如何使其发挥作用的任何想法?

2 个答案:

答案 0 :(得分:7)

这里使用的最简单的小部件可能就是text%类(你也需要一个editor-canvas%)。查看change-style及相关方法,了解如何更改特定文本的样式。

示例:

#lang racket/gui

(define frame (new frame% [label "Test"] [width 300] 
                                         [height 300]))
(define text (new text%))
(define canvas (new editor-canvas% [parent frame] 
                                   [editor text]))

(define style-delta (make-object style-delta% 
                                 'change-normal-color))

;; do some red
(send style-delta set-delta-foreground "red")
(send text change-style style-delta)
(send text insert "Hello world in red\n")

;; do some blue
(send style-delta set-delta-foreground "blue")
(send text change-style style-delta)
(send text insert "Now available in blue")

(send frame show #t)

答案 1 :(得分:0)

您不必指定change-command。

更简单:

#lang racket/gui

(define frame (new frame% [label "Test"] [width 300] 
                                         [height 300]))
(define text (new text%))
(define canvas (new editor-canvas% [parent frame] 
                                   [editor text]))

(define style-delta (make-object style-delta%))

;; do some red
(send style-delta set-delta-foreground "red")
(send text change-style style-delta)
(send text insert "Hello world in red\n")

;; do some blue
(send style-delta set-delta-foreground "blue")
(send text change-style style-delta)
(send text insert "Now available in blue\n")

;; do some modern
(send style-delta set-delta-foreground "black")
(send style-delta set-family 'modern)
(send text change-style style-delta)
(send text insert "Now available in modern\n(fixed width)")

(send frame show #t)