IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

Coder des formes g�ometriques avec GTK+Cairo


Sujet :

GTK+ avec C & C++

  1. #1
    Membre tr�s actif
    Homme Profil pro
    ch�meur
    Inscrit en
    Septembre 2015
    Messages
    175
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : ch�meur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Par d�faut Coder des formes g�ometriques avec GTK+Cairo


    �a fait longtemps que j'essaie d' afficher des formes geometrique dans un " gtk_drawing_area " .

    Car d'apr�s ce que j'ai compris c'est dans ce widget que l'on utilise cairo avec GTK .

    Bien entendu mon code se compile et s'�x�cute .
    Voici la fen�tre : http://pix.toile-libre.org/upload/or...1452685945.png

    J'ai post� ce topic partout , mais sans r�sultat :

    https://stackoverflow.com/questions/...cairo-with-gtk

    https://github.com/AdaCore/gtkada/issues/3


    Le code est en Ada , mais le probl�me n'est pas le langage , mais que faire apr�s avoir cr�e le " gtk_drawing_area " .




  2. #2
    Membre chevronn� Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de donn�es
    Inscrit en
    Octobre 2015
    Messages
    252
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 30
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Administrateur de base de donn�es
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par d�faut
    Salut,

    Il y a un tutoriel sur le GtkDrawingArea mais c'est du C et du Gtk+2 et non Gtk+3

    J'ai regard� ton git. Il semble qu'il faille ajouter :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    Connect(Widget => zone_dessin ,
              Name => "draw" ,
                Cb => ....);
    Il y a un Simple GtkDrawingArea usage dans la doc Gtk+3 (Inspire toi de la signature du callback "draw" -tu n'as pas besoin de cr�er de context cairo car il est pass� en param�tre-)

    Ceci �tant dis, je me permet d'ajouter une petit pr�cision.
    Car d�apr�s ce que j'ai compris c'est dans ce widget que l'on utilise cairo avec GTK
    Tout les GtkWidget et ses d�riv�e permettent d'utiliser Cairo via la m�thode virtuel "expose" ou via l��v�nement "expose-event".

    PS : Ce poste devrai aussi int�ress� : draw in drawing area

    @+

  3. #3
    Membre tr�s actif
    Homme Profil pro
    ch�meur
    Inscrit en
    Septembre 2015
    Messages
    175
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : ch�meur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Par d�faut
    Citation Envoy� par Gaulouis Voir le message

    Il y a un tutoriel sur le GtkDrawingArea mais c'est du C et du Gtk+2 et non Gtk+3
    Au point o� j'en suis , il est pr�f�rable de r�soudre le probleme cern� , plut�t que de suivre un tuto en C .

    Citation Envoy� par Gaulouis Voir le message
    J'ai regard� ton git. Il semble qu'il faille ajouter :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    Connect(Widget => zone_dessin ,
              Name => "draw" ,
                Cb => ....);
    Justement . Par quoi commencer , le signal "draw" ou la m�thode virtuel "expose" ou via l��v�nement "expose-event" ?

    Car en fonction de �a l' ordre du code et son fonctionnement sera tr�s diff�rent .


    Citation Envoy� par Gaulouis Voir le message
    Il y a un Simple GtkDrawingArea usage dans la doc Gtk+3 (Inspire toi de la signature du callback "draw" -tu n'as pas besoin de cr�er de context cairo car il est pass� en param�tre-)
    Je veux bien , mais il faudrait d'abord que j'ai r�ponse � la pr�c�dente question .

    Citation Envoy� par Gaulouis Voir le message
    PS : Ce poste devrai aussi int�ress� : draw in drawing area
    Oo !

    Eh ben , ils ont pas l' air de se d�brouiller mieux .

  4. #4
    Expert confirm�
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    F�vrier 2008
    Messages
    2 315
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 55
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par d�faut
    Bonsoir.

    Gaulouis t'a donn� la solution. Il faut bien passer par le signal "draw" pour dessiner dans GtkDrawingArea.

    regarde ce blog, j'utilise ce principe pour dessiner un rectangle dans un GtkLabel.

  5. #5
    Membre tr�s actif
    Homme Profil pro
    ch�meur
    Inscrit en
    Septembre 2015
    Messages
    175
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : ch�meur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Par d�faut
    Je n' ai pas pr�cis� que j'utillise la lib suivante : http://packages.ubuntu.com/precise/libgtkada2.24.1-dev

    Donc GTK2 ?

    Entre temps , J' ai fais les modifs en utilisant ton lien Gaulouis : https://developer.gnome.org/gtk3/sta...awingArea.html

    J'obtiens des erreurs de compilation a 2 lignes due au handler :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    gnatmake "dessine_avec_cairo" `gtkada-config` (dans le dossier : /home/dead-code/Bureau/graphic)
    gcc-4.6 -c -I/usr/share/ada/adainclude/gtkada dessine_avec_cairo.adb
    dessine_avec_cairo.adb:155:01: no candidate interpretations match the actuals:
    Compilation échouée.
    dessine_avec_cairo.adb:155:01: missing argument for parameter "User_Data" in call to "connect" declared at gtk-handlers.ads:1140, instance at line 44
    dessine_avec_cairo.adb:155:01: missing argument for parameter "Marsh" in call to "connect" declared at gtk-handlers.ads:1125, instance at line 44
    dessine_avec_cairo.adb:155:01: missing argument for parameter "User_Data" in call to "connect" declared at gtk-handlers.ads:1109, instance at line 44
    dessine_avec_cairo.adb:155:01: missing argument for parameter "User_Data" in call to "connect" declared at gtk-handlers.ads:1095, instance at line 44
    dessine_avec_cairo.adb:155:01: missing argument for parameter "Marsh" in call to "connect" declared at gtk-handlers.ads:1081, instance at line 44
    dessine_avec_cairo.adb:155:01: missing argument for parameter "Marsh" in call to "connect" declared at gtk-handlers.ads:880, instance at line 40
    dessine_avec_cairo.adb:155:01: missing argument for parameter "Marsh" in call to "connect" declared at gtk-handlers.ads:841, instance at line 40
    dessine_avec_cairo.adb:157:32: expected type "Simple_Handler" defined at gtk-handlers.ads:833, instance at line 40
    dessine_avec_cairo.adb:157:32: found type access to function "draw_callback" defined at line 157
    dessine_avec_cairo.adb:157:32:   ==> in call to "Connect" at gtk-handlers.ads:865, instance at line 40
    dessine_avec_cairo.adb:157:32:   ==> in call to "Connect" at gtk-handlers.ads:853, instance at line 40
    gnatmake: "dessine_avec_cairo.adb" compilation error


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    WITH Gtk.Main ;          USE Gtk.Main ;
    WITH Gtk.Window ;        USE Gtk.Window ;
    WITH Gtk.Enums ;         USE Gtk.Enums ;
    WITH Gtk.Button ;        USE Gtk.Button ;
    WITH Gtk.Alignment ;     USE Gtk.Alignment ;
    WITH Gtk.Box ;           USE Gtk.Box ;
    WITH Gtk.Gentry;         USE Gtk.Gentry;
    WITH Gtk.Widget ;        USE Gtk.Widget ;
    with Gtk.Handlers;
    WITH Gtk.Drawing_Area;  USE Gtk.Drawing_Area;
    WITH Cairo ;            USE Cairo ;
    WITH Gdk.Color ;        USE Gdk.Color ;
    WITH Gdk.Cairo ;        USE Gdk.Cairo ;
    WITH Gtk.Style ;        USE Gtk.Style ;
    WITH Glib ;             USE Glib ;
     
    PROCEDURE dessine_avec_cairo IS
     
    -----------------------
       -- VARIABLES --    |
    ----------------------------------------------------------
       win : Gtk_window ;
     
       Btn1, Btn2 ,Btn3  : Gtk_Button ;
     
       alignG, alignM ,alignD  : Gtk_Alignment ;
     
       Boite  : Gtk_VBox ;
     
       Boutons :  Gtk_HBox ;
     
       saisie : Gtk_Entry ;
     
       zone_dessin : Gtk_Drawing_Area ;
     
    ----------------------------------------------------------
    --Instanciation package(s) for connexion
    ----------------------------------------------------------
     
       PACKAGE P_Callback IS NEW Gtk.Handlers.Callback(Gtk_Widget_Record);
     
       USE P_Callback ;
     
       PACKAGE P2_Callback IS NEW Gtk.Handlers.User_Callback(Gtk_Widget_Record , Boolean);
     
       USE P2_Callback ;
     
    ----------------------------------------------------------
    --  Handlers (or callbacks)   |
    ----------------------------------------------------------
     
       procedure Stop_Program(Emetteur : access Gtk_Widget_Record'class)
       is
     
          PRAGMA Unreferenced (Emetteur);
     
       begin
     
          Main_Quit;
     
       end Stop_Program ;
     
       function draw_callback (the_Widget : access Gtk_Widget_Record'Class ;
                               cairo_t : Cairo_Context ) return boolean
       is
     
       width : Allocation_Int ;
     
       height : Allocation_Int ;
     
       color : Gdk_Color ;
     
       begin
     
       Queue_Draw (Widget => zone_dessin);
     
       width := Get_Allocation_Width (Widget => the_Widget) ;
     
       height := Get_Allocation_Height (Widget => the_Widget) ;
     
       Arc
         (Cr     => cairo_t ,
          Xc     => 2.0 ,
          Yc     => 2.0 ,
          Radius => 2.0 ,
          Angle1 => 0.0 ,
          Angle2 => 2.0 * 3.14 );
     
        color := Get_Fg
         (Style   => Get_Style (Widget => the_Widget) ,
          State_Type => State_Active) ;
     
     
        Set_Source_Color
         (Cr       => cairo_t ,
          Color    => color);
     
        Set_Fill_Rule
         (Cr        => cairo_t ,
          Fill_Rule => Cairo_Fill_Rule_Winding);
     
        return false ;
     
        end draw_callback ;
     
     
     
    -------------------------------------------------
    BEGIN
     
       Init ;
     
    ----------------
       -- NEW --   |
    -------------------------------------------------
     
       Gtk_New(zone_dessin);
     
       Gtk_New(win);
     
       Gtk_New(saisie);
     
       Gtk_New(Btn1, "Bouton 1") ;
       Gtk_New(Btn2, "Bouton 2") ;
       Gtk_New(Btn3, "Bouton 3") ;
     
       Gtk_New(alignG,0.0,1.0,1.0,1.0);
       Gtk_New(alignM,0.5,1.0,1.0,1.0);
       Gtk_New(alignD,1.0,1.0,1.0,1.0);
     
      Gtk_New_VBox
      (Boite, homogeneous => false, Spacing => 0) ;
     
      Gtk_New_HBox
      (Boutons, homogeneous => false, Spacing => 0) ;
     
    ---------------------------------
    --  Add                    |
    ---------------------------------
     
       alignG.add(Btn1) ;
       alignM.add(Btn2) ;
       alignD.add(Btn3) ;
     
       win.Add(Boite);
     
    ------------------------------------------
    --  Connect                |
    ------------------------------------------
     
    Connect(Widget => win ,
              Name => "destroy" ,
                Cb => Stop_Program'access);
     
    Connect(Widget => zone_dessin ,
              Name => "draw" ,
                Cb => draw_callback'access);
     
    ------------------------------------------
    --  Design Window          |
    ------------------------------------------
     
       Size_Allocate
         (Widget  => zone_dessin ,
          Allocation =>  ( X => 0 , Y => 0 , Width => 150 , Height => 150 ) ) ;
     
       Pack_Start
          (In_Box => Boite ,
           Child  => zone_dessin ,
           Expand => true ,
           Fill => true );
     
       Pack_Start
          (In_Box => Boite ,
           Child  => saisie ,
           Expand => false );
     
       Pack_Start
          (In_Box => Boite ,
           Child => Boutons ,
           Expand => true ,
           Fill => true );
     
     
       Pack_Start
          (In_Box => Boutons ,
           Child => alignG ,
           Expand => true ,
           Fill => true );
     
       Pack_Start
          (In_Box => Boutons ,
           Child => alignM ,
           Expand => true ,
           Fill => true );
     
       Pack_Start
          (In_Box => Boutons ,
           Child => alignD ,
           Expand => true ,
           Fill => true );
     
     
     
       win.Set_Default_Size(600,500) ;
     
       win.set_position(Win_Pos_Mouse) ;
     
       win.set_opacity(0.7) ;
     
       win.Show_all ;
       Main ;
     
    END dessine_avec_cairo ;

  6. #6
    Membre chevronn� Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de donn�es
    Inscrit en
    Octobre 2015
    Messages
    252
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 30
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Administrateur de base de donn�es
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par d�faut Quel est ton niveau en Ada ?
    La documentation Gtk+2 donne une signature :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    gboolean
    expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
    Donc en Ada, ca devrai donner quelques chose comme :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    function draw_callback (Widget : access Gtk_Widget_Record'Class ;
                            Event  : in Gdk_Event_Expose;
                            Data   : in Gpointer ) return boolean
    is
    begin
      -- do stuff --
    end draw_callback;

    PS : Je ne connais pas le langage Ada.

  7. #7
    Membre tr�s actif
    Homme Profil pro
    ch�meur
    Inscrit en
    Septembre 2015
    Messages
    175
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : ch�meur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Par d�faut Mon niveau en ADA est correct
    Citation Envoy� par Gaulouis Voir le message
    La documentation Gtk+2 donne une signature :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    gboolean
    expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
    Donc en Ada, ca devrai donner quelques chose comme :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    function draw_callback (Widget : access Gtk_Widget_Record'Class ;
                            Event  : in Gdk_Event_Expose;
                            Data   : in Gpointer ) return boolean
    is
    begin
      -- do stuff --
    end draw_callback;
    Bon , j'ai trouv� le lien pour ton exemple : https://developer.gnome.org/gtk2/sta...awingArea.html

    Mais ... �a n'a rien � voir avec GTK3 .

    O� est pass� le signal "draw" ?

    Il n'y a que du "expose_event" .

    Il n'y a plus de "Cairo_Context" , non plus .

    Bref , autant tout recommencer .


    En ce qui concerne les handlers =

    En ADA , il existe une notion d' instantiation pour les packages g�n�rique .

    Et c'est justement le package g�n�rique correspondant au handler , qu'il me faut dans le code .

    Mais , l� ce n'est pas le m�me , donc � revoir .

  8. #8
    Membre chevronn� Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de donn�es
    Inscrit en
    Octobre 2015
    Messages
    252
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 30
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Administrateur de base de donn�es
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par d�faut Peut �tre comme �a
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
       package Configured is new Gtk.Handlers.Return_Callback
         (Widget_Type => Gtk_Drawing_Area_Record,
          Return_Type => Boolean);
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
       Configured.Connect (Widget => zone_dessin,
                           Name   => "expose_event",
                           Marsh  => Configured.To_Marshaller
                              (Expose_Event'Access));
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
       function Expose_Event
         (zone_dessin : access Gtk_Drawing_Area_Record'Class;
          Event : in Gdk.Event.Gdk_Event;
          Data   : in Gpointer)
          return Boolean
       is
          Area : Gdk_Rectangle := Get_Area (Event);
          Window : Gdk_Window := Get_Window (zone_dessin);
          Context : Cairo_Context := Cairo_Create (Window);
       begin
     
          -- do draw
     
          return True;
       end Expose_Event;

  9. #9
    Membre tr�s actif
    Homme Profil pro
    ch�meur
    Inscrit en
    Septembre 2015
    Messages
    175
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : ch�meur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Par d�faut
    Citation Envoy� par Gaulouis Voir le message
    Context : Cairo_Context := Cairo_Create (Window);
    Cette fonction n'existe pas dans le binding Ada .

    Par contre il y a celles-l� :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
     --function Create (Drawable : Gdk_Drawable) return Cairo_Context;
     
        --function Create (Target : Cairo_Surface) return Cairo_Context;
    J'ai all�g� le code , mais c'est pas encore �a .

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    WITH Gtk.Main ;          USE Gtk.Main ;
    WITH Gtk.Window ;        USE Gtk.Window ;
    WITH Gtk.Enums ;         USE Gtk.Enums ;
    WITH Gtk.Widget ;        USE Gtk.Widget ;
    with Gtk.Handlers;
    WITH Gtk.Drawing_Area;  USE Gtk.Drawing_Area;
     
     
    WITH Cairo ;            USE Cairo ;
    WITH Gdk.Color ;        USE Gdk.Color ;
    WITH Gdk.Cairo ;        USE Gdk.Cairo ;
    WITH Gtk.Style ;        USE Gtk.Style ;
    WITH Glib ;             USE Glib ;
    WITH Gdk.Event ;        USE Gdk.Event ;
    --WITH Gdk.Rectangle ;    USE Gdk.Rectangle ;
    WITH Gdk ;              USE Gdk ;
     
    PROCEDURE dessine_avec_cairo IS
     
    -----------------------
       -- VARIABLES --    |
    ----------------------------------------------------------
       win : Gtk_window ;
     
       zone_dessin : Gtk_Drawing_Area ;
     
    ----------------------------------------------------------
    --Instanciation package(s) for connexion
    ----------------------------------------------------------
     
       PACKAGE P_Callback IS NEW Gtk.Handlers.Callback(Gtk_Widget_Record);
     
       USE P_Callback ;
     
       PACKAGE Configured IS NEW Gtk.Handlers.Return_Callback
         (Widget_Type => Gtk_Drawing_Area_Record,
          Return_Type => Boolean);
     
    ----------------------------------------------------------
    --  Handlers (or callbacks)   |
    ----------------------------------------------------------
     
       procedure Stop_Program(Emetteur : access Gtk_Widget_Record'class)
       is
     
          PRAGMA Unreferenced (Emetteur);
     
       begin
     
          Main_Quit;
     
       end Stop_Program ;
     
     
       function Expose_Event
         (the_Widget : access Gtk_Drawing_Area_Record'Class;
          Event : Gdk.Event.Gdk_Event )
          return Boolean
       is
     
        Area : Gdk_Rectangle := Get_Area (Event);
     
        Context : Cairo_Context ;
     
        drawable : Gdk_Drawable ;
     
        Win2 : Gdk_Window ;
     
        begin
     
        Context := Create ( drawable ) ;
     
        Win2 := Get_Window (Widget => the_Widget) ;
     
        return true ;
     
        end expose_event;
     
    -------------------------------------------------
    BEGIN
     
       Init ;
     
    ----------------
       -- NEW --   |
    -------------------------------------------------
     
       Gtk_New(zone_dessin);
     
       Gtk_New(win);
     
    ---------------------------------
    --  Add                    |
    ---------------------------------
     
       win.Add( zone_dessin );
     
    ------------------------------------------
    --  Connect                |
    ------------------------------------------
     
    Connect(Widget => win ,
              Name => "destroy" ,
                Cb => Stop_Program'access);
     
     
    Configured.Connect (Widget => zone_dessin,
                           Name   => "expose_event",
                           Marsh  => Configured.To_Marshaller
                              (Expose_Event'Access));
     
    ------------------------------------------
    --  Design Window          |
    ------------------------------------------
     
       Size_Allocate
         (Widget  => zone_dessin ,
          Allocation =>  ( X => 0 , Y => 0 , Width => 150 , Height => 150 ) ) ;
     
       win.Set_Default_Size(600,500) ;
     
       win.set_position(Win_Pos_Center) ;
     
       win.set_opacity(0.7) ;
     
       win.Show_all ;
       Main ;
     
    END dessine_avec_cairo ;

  10. #10
    Membre chevronn� Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de donn�es
    Inscrit en
    Octobre 2015
    Messages
    252
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 30
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Administrateur de base de donn�es
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par d�faut
    C'est cette fonction qu'il faut utiliser :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    --function Create (Drawable : Gdk_Drawable) return Cairo_Context;
    Ensuite il reste plus qu'a dessiner...
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       function Expose_Event
    -- ...
        begin
        Win2 := Get_Window (Widget => the_Widget) ;
        drawable := Gdk_Drawable (Win2) ;-- transtypage
        Context := Create ( drawable ) ;
     
        Set_Source_Rgb(Context, 1.0, 0.0, 0.0);
        Rectangle(Context, 0, 0, 100, 20);
        Fill(Context);
     
        return true ;
        end expose_event;
    PS: Il y a s�rement des erreurs de syntaxe et autre...

    Edit:
    O� est pass� le signal "draw" ?
    Le signal "draw" a �t� introduit dans la version 3 de Gtk+ Il n'est donc pas disponible pour la version 2 de Gtk+

    Il n'y a que du "expose_event" .
    Tu n'as plus a te poser la question sur le choix de l��v�nement a utiliser. Reste le choix entre la surcharge GtkWidget::expose et le Callback "expose_event"

    Il n'y a plus de "Cairo_Context" , non plus .
    Avec Gtk+2, GdkWindow est pass� en param�tre aux m�thode de dessin (pour dessiner les widget) . Il faut donc cr�er u nouveau context cairo a chaque fois.
    Gtk+3 corrige �a en passant le context cairo en parametre.

  11. #11
    Membre tr�s actif
    Homme Profil pro
    ch�meur
    Inscrit en
    Septembre 2015
    Messages
    175
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : ch�meur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Par d�faut
    -- transtypage
    Qu'est-ce que tu veux faire exactement ?

    J'ai adapt� ton code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     function Expose_Event
         (the_Widget : access Gtk_Drawing_Area_Record'Class;
          Event : Gdk.Event.Gdk_Event )
          return Boolean
       is
     
        Area : Gdk_Rectangle := Get_Area (Event);
     
        Context : Cairo_Context ;
     
        drawable : Gdk_Drawable ;
     
        Win2 : Gdk_Window ;
     
        begin
     
        Win2 := Get_Window (Widget => the_Widget) ;
     
        drawable := Gdk_Drawable (Win2) ;-- transtypage
     
        Context := Create ( drawable ) ;
     
         Set_Source_Rgb(Context, 1.0, 0.0, 0.0);
     
        Rectangle
         (Cr     => Context ,
          X      => 0.0 ,
          Y      => 0.0 ,
          Width  => 100.0 ,
          Height => 20.0 );
     
       Set_Fill_Rule
         (Cr        => Context ,
          Fill_Rule => Cairo_Fill_Rule_Winding);
     
        return true ;
     
        end expose_event;

  12. #12
    Membre chevronn� Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de donn�es
    Inscrit en
    Octobre 2015
    Messages
    252
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 30
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Administrateur de base de donn�es
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par d�faut
    Je voulais faire un cast, une conversion de type, une coercition de type

    Peut �tre qu'on peu �crire directement :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Context := Create ( Get_Window (Widget => the_Widget) ) ;
    Je n'avais jamais regard� Ada avant. C'est normal si c'est autant verbeux; ou le nom des param�tres pass� est optionnel ?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
        Rectangle
         (Cr     => Context ,
          X      => 0.0 ,
          Y      => 0.0 ,
          Width  => 100.0 ,
          Height => 20.0 );

    Edit : Finalement �a marche ? Le rectangle s'affiche ?

  13. #13
    Membre tr�s actif
    Homme Profil pro
    ch�meur
    Inscrit en
    Septembre 2015
    Messages
    175
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : ch�meur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Par d�faut
    Pour la conversion :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Context := Create ( drawable ) ;
    Cette fonction retourne un "Cairo_Context" et prends uniquement en parametre un "Gdk_Drawable" .

    Context := Create ( Get_Window (Widget => the_Widget) ) ;
    Et l� tu veux lui donner en param�tre un "Gdk_Window" ?

    Je ne pense pas cela possible .

    Sinon , on peut cr�er un autre type ou subtype .

    Ou alors faut avoir de l' experience en Prog GTK de bas niveau .

    ----------------------------------------------

    Quand on utilise une association de parametre ( nom de parametre + la fleche) , c'est pour rendre le code plus clair , c'est optionnel .

    De plus , la procedure rectangle dans le binding utilise des "gdoubles" , et non des "gint" .

    --------------------------------------------
    Edit : Pour qu'un rectangle s'affiche faudrait d�j� que le code puisse compiler

  14. #14
    Membre chevronn� Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de donn�es
    Inscrit en
    Octobre 2015
    Messages
    252
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 30
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Administrateur de base de donn�es
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par d�faut
    Bein j'ai install� Ada et GtkAda-2.24 mais quand j�essaie de compile j'ai des erreurs de type undefine reference, donc un probl�me de linkage avec Gtk. Donc j'ai laiss� tomb� ... C'est pour �a que je comptai sur toi pour nous donner un exemple fonctionnel.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    gnatmake dessine_avec_cairo -aI/usr/share/ada/adainclude/gtkada 'gtkada-config'
    référence indéfinie vers « gtk_main »
    Pour qu'un rectangle s'affiche faudrait d�j� que le code puisse compiler
    Quel erreurs as tu ?

    Et l� tu veux lui donner en param�tre un "Gdk_Window" ?
    Clairement oui ! C'est pour �a que je disais de faire une conversion de type:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
        Win2 := Get_Window (Widget => the_Widget) ;
        drawable := Gdk_Drawable (Win2) ;
        Context := Create ( drawable ) ;
    Je ne pense pas cela possible.
    Dans la doc Ada c'est �crit que pour transtyper un Gdk_Window en Gdk_Drawable il faut faire : Gdk_Drawable (Win2)

    Ou alors faut avoir de l' experience en Prog GTK de bas niveau .
    Je n'ai pas la pr�tention de dire �a. Mais �a fais super plaisir

  15. #15
    Membre tr�s actif
    Homme Profil pro
    ch�meur
    Inscrit en
    Septembre 2015
    Messages
    175
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : ch�meur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Par d�faut
    Citation Envoy� par Gaulouis Voir le message
    Bein j'ai install� Ada et GtkAda-2.24 mais quand j�essaie de compile j'ai des erreurs de type undefine reference, donc un probl�me de linkage avec Gtk. Donc j'ai laiss� tomb� ... C'est pour �a que je comptai sur toi pour nous donner un exemple fonctionnel.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    gnatmake dessine_avec_cairo -aI/usr/share/ada/adainclude/gtkada 'gtkada-config'
    référence indéfinie vers « gtk_main »
    C'est pas �a la bonne commande de compilation , fait simplement :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    gnatmake dessine_avec_cairo.adb `gtkada-config`
    ----------------------------------

    Oublie les erreurs du compilo pour l'instant , je n'avais pas compris ce que tu essayait de faire . (transtypage) .

    Citation Envoy� par Gaulouis Voir le message
    Dans la doc Ada c'est �crit que pour transtyper un Gdk_Window en Gdk_Drawable il faut faire : Gdk_Drawable (Win2)
    Ben... tu pourrai me linker ?

    On aura les m�mes infos .

    Citation Envoy� par Gaulouis Voir le message
    Je n'ai pas la pr�tention de dire �a. Mais �a fais super plaisir
    C'est m�rit�

  16. #16
    Membre chevronn� Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de donn�es
    Inscrit en
    Octobre 2015
    Messages
    252
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 30
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Administrateur de base de donn�es
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par d�faut Ca marche du feux de Dieu

    J'avais une faute d�s le d�part :"'" au lieu de "`"
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    gnatmake dessine_avec_cairo.adb `gtkada-config`
    Merci l'artiste

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    WITH Gtk.Main ;          USE Gtk.Main ;
    WITH Gtk.Window ;        USE Gtk.Window ;
    WITH Gtk.Enums ;         USE Gtk.Enums ;
    WITH Gtk.Widget ;        USE Gtk.Widget ;
    with Gtk.Handlers;
    WITH Gtk.Drawing_Area;  USE Gtk.Drawing_Area;
     
     
    WITH Cairo ;            USE Cairo ;
    WITH Gdk.Color ;        USE Gdk.Color ;
    WITH Gdk.Cairo ;        USE Gdk.Cairo ;
    WITH Gtk.Style ;        USE Gtk.Style ;
    WITH Glib ;             USE Glib ;
    WITH Gdk.Event ;        USE Gdk.Event ;
    WITH Gdk.Rectangle ;    USE Gdk.Rectangle ;
    WITH Gdk ;              USE Gdk ;
     
    PROCEDURE dessine_avec_cairo IS
     
    -----------------------
       -- VARIABLES --    |
    ----------------------------------------------------------
       win : Gtk_window ;
     
       zone_dessin : Gtk_Drawing_Area ;
     
    ----------------------------------------------------------
    --Instanciation package(s) for connexion
    ----------------------------------------------------------
     
       PACKAGE P_Callback IS NEW Gtk.Handlers.Callback(Gtk_Widget_Record);
     
       USE P_Callback ;
     
       PACKAGE Configured IS NEW Gtk.Handlers.Return_Callback
         (Widget_Type => Gtk_Drawing_Area_Record,
          Return_Type => Boolean);
     
    ----------------------------------------------------------
    --  Handlers (or callbacks)   |
    ----------------------------------------------------------
     
       procedure Stop_Program(Emetteur : access Gtk_Widget_Record'class)
       is
     
          PRAGMA Unreferenced (Emetteur);
     
       begin
     
          Main_Quit;
     
       end Stop_Program ;
     
     
     
       function Expose_Event
         (the_Widget : access Gtk_Drawing_Area_Record'Class;
          Event : Gdk.Event.Gdk_Event )
          return Boolean
       is
        Area : Gdk_Rectangle := Get_Area (Event);
        Region : Gdk_Rectangle;
     
        Context : Cairo_Context ;
        Win2 : Gdk_Window ;
        drawable : Gdk_Drawable ;
     
        begin
     
        Win2 := Get_Window (Widget => the_Widget) ;
        drawable := Gdk_Drawable (Win2) ;-- transtypage
        Context := Create ( drawable ) ;
     
        Region.Width := Area.Width / 2;
        Region.Height := Area.Height / 2;
        Region.X := Region.Width / 2;
        Region.Y := Region.Height / 2;
     
        Set_Source_Rgb(Context, 1.0, 0.0, 0.0);
        Cairo.Rectangle(Cr => Context, X => GDouble(Region.X), Y => GDouble(Region.Y), Width => GDouble(Region.Width), Height => GDouble(Region.Height));
        Cairo.Fill_Preserve(Context);
     
        Set_Line_Width(Context, 1.0);
        Set_Source_Rgb(Context, 0.0, 0.0, 1.0);
        Cairo.Stroke(Context);
     
     
        return false ;
     
        end expose_event;
     
     
    -------------------------------------------------
    BEGIN
     
       Init ;
     
    ----------------
       -- NEW --   |
    -------------------------------------------------
     
       Gtk_New(zone_dessin);
     
       Gtk_New(win);
     
    ---------------------------------
    --  Add                    |
    ---------------------------------
     
       win.Add( zone_dessin );
     
    ------------------------------------------
    --  Connect                |
    ------------------------------------------
     
    Connect(Widget => win ,
              Name => "destroy" ,
                Cb => Stop_Program'access);
     
     
    Configured.Connect (Widget => zone_dessin,
                           Name   => "expose_event",
                           Marsh  => Configured.To_Marshaller
                              (Expose_Event'Access));
     
    ------------------------------------------
    --  Design Window          |
    ------------------------------------------
     
       Size_Allocate
         (Widget  => zone_dessin ,
          Allocation =>  ( X => 0 , Y => 0 , Width => 150 , Height => 150 ) ) ;
     
       win.Set_Default_Size(600,500) ;
     
       win.set_position(Win_Pos_Center) ;
     
       win.set_opacity(0.7) ;
     
       win.Show_all ;
       Main ;
     
    END dessine_avec_cairo ;
    Ca compile mais c'est pas super chez moi ... Je suis sous Ubuntu avec plein de bug de la part de compiz ...

    Edit : Petite �toffage de la fonction expose_event
    edit2 : Il est pr�f�rable de ne pas casser la cha�ne des �v�nement. Donc return false pour expose_event
    Edit3 : Transtypage Ada : https://en.wikibooks.org/wiki/Ada_Pr...pe_conversions
    Edite 4: Screenshot:
    Nom : dessine_avec_cairo.png
Affichages : 479
Taille : 8,1 Ko

    bonne nuit

  17. #17
    Membre tr�s actif
    Homme Profil pro
    ch�meur
    Inscrit en
    Septembre 2015
    Messages
    175
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : ch�meur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Par d�faut
    L� , Chapeau



    La conversion de type pour GTK , alors qu'elle est illustr� avec des types Standard , fallait trouver

    -------------------------------------------------------------

    En effet , �a fonctionne !

    Bon , je comprend 2/3 , mais �a fonctionne .

    ex : Size_Allocate n'a aucun effet .
    ------------------------------

    A +

  18. #18
    Membre chevronn� Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de donn�es
    Inscrit en
    Octobre 2015
    Messages
    252
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 30
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Administrateur de base de donn�es
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par d�faut
    Si tu souhaite modifier/retrouver la taille minimal (incompressible) d'un GtkDrawingArea il faut utiliser Set_Size_Request/Get_Size_Request
    La m�thode virtuel Size_Request est l'impl�mentation de Get_Size_Request
    Size_Allocate indique qu'elle taille est donn�e au widget pour son affichage. En �criture cela permet de resizer le GdkWindow. En lecture cela permet de conna�tre la zone d'affichage. Tu peu acc�der a cette propri�t� depuis the_widget->allocation

    On peut am�liorer le code en rempla�ant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Area : Gdk_Rectangle := Get_Area (Event);
    Par :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Area : Gdk_Rectangle := Get_Allocation(Widget=>the_widget)
    Get_Area comme get_allocation indique la zone total d'affichage du widget.
    Alors que Get_Region indique le rectangle a mettre � jour dans le widget

  19. #19
    Membre tr�s actif
    Homme Profil pro
    ch�meur
    Inscrit en
    Septembre 2015
    Messages
    175
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : ch�meur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Par d�faut
    Size_Allocate indique qu'elle taille est donn�e au widget pour son affichage. En �criture cela permet de resizer le GdkWindow. En lecture cela permet de conna�tre la zone d'affichage.
    J'ai pas l'impression que �a permet de "resizer le GdkWindow" .

    En utilisant cette procedure , aucun changement de taille (visible) n'est effectu� .

    Voici sa decription dans la library :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    procedure Size_Allocate
         (Widget     : access Gtk_Widget_Record;
          Allocation : Gtk_Allocation);
       --  Emit a "size_allocate" event for the widget.
       --  Allocation'size is first constrained to a range between 1x1 and
       --  32767x32767.
       --  A clear and draw request is also queued if required.
     
     type Gtk_Allocation is record
          X      : Gint;
          Y      : Gint;
          Width  : Allocation_Int;
          Height : Allocation_Int;
       end record;
       --  Gtk_Allocation indicates a size and position a widget was allocated.
    ------------------------------------------

    Sinon , j'ai compris pour Set_Size_Request & Get .

    ----------------------------------------

    Peut-�tre que parce que la fen�tre ne comprend pas de boite , aucun changement de taille n'est possible ?

  20. #20
    Membre chevronn� Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de donn�es
    Inscrit en
    Octobre 2015
    Messages
    252
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 30
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Administrateur de base de donn�es
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par d�faut
    J'ai pas l'impression que �a permet de "resizer le GdkWindow" .
    Je me suis mal exprim�;
    Size_Allocate indique qu'elle taille est donn�e au widget pour son affichage. Size_Allocate permet d'indiquer la taille de la m�moire tampon dans laquel le dessin pourra se faire
    C'est cette zone m�moire (restreinte par Gdk_Event_Expose.Gdk_Region) qui sera envoy� a ta carte grapique/ecran.

    En utilisant cette procedure , aucun changement de taille (visible) n'est effectu�.
    Si tu fais un Size_Allocate(..., Gdk_Allocation(0, 0, 10, 10)) mais que ton widget fait 100 pixels sur 100, le widget ne serra dessin� que sur une zone de 10 pixel sur 10. et de jolie bug graphique apparaitrons. Je n'appel jamais pas cette fonction.

    Si tu souhaite agrandir ton widget redimensionne ta fen�tre Ou ajoute un GtkScrolledWindow:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    -- gnatmake dessine_avec_cairo.adb `gtkada-config`
     
     
    WITH Gtk.Main ;          USE Gtk.Main ;
    WITH Gtk.Window ;        USE Gtk.Window ;
    WITH Gtk.Enums ;         USE Gtk.Enums ;
    WITH Gtk.Widget ;        USE Gtk.Widget ;
    with Gtk.Handlers;
    WITH Gtk.Drawing_Area;  USE Gtk.Drawing_Area;
    WITH Gtk.Scrolled_Window; USE Gtk.Scrolled_Window ;
     
    WITH Cairo ;            USE Cairo ;
    WITH Gdk.Color ;        USE Gdk.Color ;
    WITH Gdk.Cairo ;        USE Gdk.Cairo ;
    WITH Gtk.Style ;        USE Gtk.Style ;
    WITH Glib ;             USE Glib ;
    WITH Gdk.Event ;        USE Gdk.Event ;
    WITH Gdk.Rectangle ;    USE Gdk.Rectangle ;
    WITH Gdk ;              USE Gdk ;
     
    PROCEDURE dessine_avec_cairo IS
     
    -----------------------
       -- VARIABLES --    |
    ----------------------------------------------------------
       win : Gtk_window ;
     
       scrolled_window : Gtk_Scrolled_Window ;
     
       zone_dessin : Gtk_Drawing_Area ;
     
     
    ----------------------------------------------------------
    --Instanciation package(s) for connexion
    ----------------------------------------------------------
     
       PACKAGE P_Callback IS NEW Gtk.Handlers.Callback(Gtk_Widget_Record);
     
       USE P_Callback ;
     
       PACKAGE Configured IS NEW Gtk.Handlers.Return_Callback
         (Widget_Type => Gtk_Drawing_Area_Record,
          Return_Type => Boolean);
     
    ----------------------------------------------------------
    --  Handlers (or callbacks)   |
    ----------------------------------------------------------
     
       procedure Stop_Program(Emetteur : access Gtk_Widget_Record'class)
       is
     
          PRAGMA Unreferenced (Emetteur);
     
       begin
     
          Main_Quit;
     
       end Stop_Program ;
     
     
       function Expose_Event
         (the_Widget : access Gtk_Drawing_Area_Record'Class;
          Event : Gdk.Event.Gdk_Event )
          return Boolean
       is
        Area : Gdk_Rectangle := Get_Area (Event);
        Region : Gdk_Rectangle;
     
        Context : Cairo_Context ;
        Win2 : Gdk_Window ;
        drawable : Gdk_Drawable ;
     
        begin
     
        Win2 := Get_Window (Widget => the_Widget) ;
        drawable := Gdk_Drawable (Win2) ;-- transtypage
        Context := Create ( drawable ) ;
     
        Region.Width := Area.Width / 2;
        Region.Height := Area.Height / 2;
        Region.X := Region.Width / 2;
        Region.Y := Region.Height / 2;
     
        Set_Source_Rgb(Context, 1.0, 0.0, 0.0);
        Cairo.Rectangle(Cr => Context, X => GDouble(Region.X), Y => GDouble(Region.Y), Width => GDouble(Region.Width), Height => GDouble(Region.Height));
        Cairo.Fill_Preserve(Context);
     
        Set_Line_Width(Context, 1.0);
        Set_Source_Rgb(Context, 0.0, 0.0, 1.0);
        Cairo.Stroke(Context);
     
     
        return true ;
     
        end expose_event;
     
    -------------------------------------------------
    BEGIN
     
       Init ;
     
    ----------------
       -- NEW --   |
    -------------------------------------------------
     
       Gtk_New(zone_dessin);
     
       Gtk_New(scrolled_window);
     
       Gtk_New(win);
     
    ---------------------------------
    --  Add                    |
    ---------------------------------
     
       scrolled_window.Add_With_Viewport( zone_dessin );
     
       win.Add( scrolled_window );
     
    ------------------------------------------
    --  Connect                |
    ------------------------------------------
     
    Connect(Widget => win ,
              Name => "destroy" ,
                Cb => Stop_Program'access);
     
     
    Configured.Connect (Widget => zone_dessin,
                           Name   => "expose_event",
                           Marsh  => Configured.To_Marshaller
                              (Expose_Event'Access));
     
    ------------------------------------------
    --  Design Window          |
    ------------------------------------------
     
       Set_Size_Request(zone_dessin, 800, 800);
     
       win.Set_Default_Size(600,500) ;
     
       win.set_position(Win_Pos_Center) ;
     
       win.set_opacity(0.7) ;
     
       win.Show_all ;
       Main ;
     
    END dessine_avec_cairo ;
    Que ce passe-t-il si tu modifie le code avec : Set_Size_Request(zone_dessin, 500, 400);
    Que ce passe-t-il si tu redimensionne la fen�tre a son minimum.
    Ajoute Set_Size_Request(scrolled_window, 200, 200); et redimensionne la fen�tre a son minimum.

    PS: Je dois te quitter, on m'appel pour all� go�ter ^^

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 1 sur 2 12 Derni�reDerni�re

Discussions similaires

  1. Gestion des fichiers XML avec GTK+
    Par djibril dans le forum Contribuez
    R�ponses: 17
    Dernier message: 16/10/2017, 10h18
  2. Remplir des formes graphiques avec des motifs (quadrillage, ligne verticale, etc)
    Par La Piotte dans le forum Interfaces Graphiques en Java
    R�ponses: 3
    Dernier message: 04/10/2007, 00h16
  3. Modifier des formes Visio avec des donn�es Excel
    Par Hubs702 dans le forum Visio
    R�ponses: 4
    Dernier message: 25/06/2007, 07h19
  4. Remplissage d'une forme gauche avec des rectangles
    Par Aiekick dans le forum Algorithmes et structures de donn�es
    R�ponses: 3
    Dernier message: 24/03/2006, 19h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo