Haskell 如何更改Gtk2Hs中绘图区域的属性

Haskell 如何更改Gtk2Hs中绘图区域的属性,haskell,gtk,gtk2hs,Haskell,Gtk,Gtk2hs,当涉及到改变Gtk2Hs中元素的属性时,有人能给我指出正确的方向吗 例如,如何更改绘图区域的背景色?修改小部件样式的方法多种多样。例如,修改可以使用的背景样式(对应于C函数)。原则上,如果更改一个状态(例如StateNormal)的样式,则还应更改其他状态的样式 Y建议您在RC文件中描述所需的样式,然后从应用程序中加载该文件,但似乎gtk2hs中没有绑定类似的函数 下面是一个例子: import Graphics.UI.Gtk main = do initGUI window

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


例如,如何更改绘图区域的背景色?

修改小部件样式的方法多种多样。例如,修改可以使用的背景样式(对应于C函数)。原则上,如果更改一个状态(例如StateNormal)的样式,则还应更改其他状态的样式

Y建议您在RC文件中描述所需的样式,然后从应用程序中加载该文件,但似乎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

是否可以在按钮单击等事件发生时更改绘图区域?或者用新的方法替换它是正确的方法吗?您必须在expose回调中进行绘制(在Gtk 3中,绘制回调),但是您可以使用
widgetQueueDraw
从事件处理程序强制重画。
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