Quelqu'un peut-il me diriger dans la bonne direction quand il s'agit de changer les propriétés d'un élément dans Gtk2Hs. Par exemple, comment changer la couleur de fond d'un DrawingArea? Par exemple, comment changer la couleur de fond d'un DrawingArea?Comment modifier les propriétés de DrawingArea dans Gtk2Hs
Répondre
Il existe plusieurs méthodes pour modifier le style d'un widget. Par exemple, pour modifier le style d'arrière-plan, vous pouvez utiliser widgetModifyBg
(correspondant à la fonction C gtk_widget_modify_bg()
). En principe, si vous modifiez le style d'un état (par exemple StateNormal), vous devez également le modifier pour les autres.
Y vous suggère de décrire les styles que vous voulez dans un fichier RC, puis chargez ce fichier à partir de votre application, mais il semble que des fonctions comme gtk_rc_parse()
ne sont pas liées dans gtk2hs.
Voici un exemple:
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
Si vous devez faire le dessin personnalisé en fonction des styles d'un widget, vous pouvez le faire en utilisant widgetGetState
, la propriété widgetStyle
et la famille styleGet*
des fonctions (par exemple styleGetText
). Voici un exemple de cela:
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
Est-il possible de changer la zone de dessin lors d'un événement comme un clic de bouton? Ou est la bonne approche pour le remplacer en quelque sorte par un nouveau? – VF1
Vous devez faire le dessin dans le rappel d'exposition (dans Gtk 3, le rappel draw), mais vous pouvez forcer un redraw à partir d'un gestionnaire d'événements en utilisant 'widgetQueueDraw'. – daf