2009-12-13 3 views

Répondre

3

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 
+0

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

+0

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

Questions connexes