Как изменить свойства DrawingArea в Gtk2Hs

Может кто-нибудь указать мне правильное направление, когда дело доходит до изменения свойств элемента в Gtk2Hs.

Например, как изменить цвет фона DrawingArea?


person Mickel    schedule 13.12.2009    source источник


Ответы (1)


Существуют различные методы изменения стиля виджета. Например, чтобы изменить стиль фона, вы можете использовать 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

Если вам нужно сделать пользовательский рисунок на основе стилей виджета, вы можете сделать это с помощью widgetGetState, свойство widgetStyle и семейство функций 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
person daf    schedule 13.12.2009
comment
Можно ли изменить область рисования при нажатии кнопки? Или правильный подход как-то заменить его на новый? - person VF1; 28.12.2014
comment
Вы должны сделать отрисовку в обратном вызове expose (в Gtk 3 обратный вызов отрисовки), но вы можете принудительно перерисовать из обработчика событий, используя widgetQueueDraw. - person daf; 08.02.2015