1

当涉及到更改 Gtk2Hs 中元素的属性时,有人能指出我正确的方向吗?

例如,如何更改 DrawingArea 的背景颜色?

4

1 回答 1

3

有多种方法可以修改小部件的样式。比如修改你可以使用的背景样式widgetModifyBg(对应C函数gtk_widget_modify_bg())。原则上,如果您更改一种状态的样式(例如 StateNormal),那么您也应该更改其他状态的样式。

Y 建议您在 RC 文件中描述您想要的样式,然后从您的应用程序中加载该文件,但似乎gtk_rc_parse()gtk2hs 中没有绑定类似的功能。

这是一个例子:

import Graphics.UI.Gtk

main = do
    initGUI
    window <- windowNew
    window `onDestroy` mainQuit
    drawingArea <- drawingAreaNew
    window `containerAdd` drawingArea
    widgetModifyBg drawingArea StateNormal (Color 0xffff 0 0)
    widgetShowAll window
    mainGUI

如果您需要根据小部件的样式进行自定义绘图,您可以使用widgetGetStatewidgetStyle属性和styleGet*函数族(例如styleGetText)来完成。这是一个例子:

import Graphics.Rendering.Cairo
import Graphics.UI.Gtk hiding (fill)
import Graphics.UI.Gtk.Gdk.Events (Event(Expose))

expose widget rect = do
    state <- widgetGetState widget
    style <- widget `get` widgetStyle
    (Color red green blue) <- styleGetText style state
    drawWindow <- widgetGetDrawWindow widget

    renderWithDrawable drawWindow $ do
        moveTo 50 50
        setFontSize 20
        setSourceRGB (fromIntegral red / 0xffff)
                     (fromIntegral green / 0xffff)
                     (fromIntegral blue / 0xffff)
        showText "O HAI"
        fill

    return False

main = do
    initGUI
    window <- windowNew
    window `onDestroy` mainQuit
    drawingArea <- drawingAreaNew
    drawingArea `onExpose` \(Expose sent area region count) ->
        expose drawingArea area
    window `containerAdd` drawingArea
    widgetShowAll window
    mainGUI
于 2009-12-13T23:31:01.737 回答