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

Windows Presentation Foundation Discussion :

Faire une grille en WPF


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut Faire une grille en WPF
    Salut a tous !

    Voila j'aimerais faire un truc tout simple, peut être même il existe un control, mais je ne sais pas le quel, qui me permettrait de faire une grille !

    Comme par exemple faire le jeu de la vie : https://upload.wikimedia.org/wikiped...er_gun.svg.png
    https://en.wikipedia.org/wiki/Conway's_Game_of_Life

    Par exemple pouvoir generer une grille et colorier la case que je veux en blanc ou en noir (ou autre ^^) !

    Comment pourrais je faire ca ?

    Merci

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    tu fais une grid avec des row et des colonm
    et dans chaque row/colum tu colle un rectange ou un object a ta sauce que tu pourra coloriser
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 149
    Points : 46
    Points
    46
    Par défaut
    Ouais je suis d'accord mais ce sera pas un peu lourd ? Car j'imagine quand même du 200x200 minimum

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    sinon tu utilise un canvas tu dessine dessine dessus des carré pour ta grid (tu surcharge le canvas)
    et tu surcharge le clique sur le canvas et du détermine la position donc le carré ou tu as cliqué et tu colore ainsi
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  5. #5
    Membre confirmé Avatar de Issam
    Inscrit en
    Mars 2002
    Messages
    578
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2002
    Messages : 578
    Points : 604
    Points
    604
    Par défaut
    une idée a tester :

    tu crée autant d'objets que tu veux (des rectangles par exemple), tu leurs donne tous la même taille et tu les rajoute dans une grid vide .

    ensuite pour les positionner et les animer éventuellement , tu manipule juste leurs propriété rendertransform

    a noter que tes objets doivent partager le même brush stocké dans un resourcedictionnay par ex.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    Citation Envoyé par Issam Voir le message
    une idée a tester :

    tu crée autant d'objets que tu veux (des rectangles par exemple), tu leurs donne tous la même taille et tu les rajoute dans une grid vide .

    ensuite pour les positionner et les animer éventuellement , tu manipule juste leurs propriété rendertransform

    a noter que tes objets doivent partager le même brush stocké dans un resourcedictionnay par ex.
    c'est ce que j'avais proposé
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    Naografix
    Ouais je suis d'accord mais ce sera pas un peu lourd ?
    Effectivement avec un grid ou canvas...mais surement pas avec le peu usite panel dit UniformGrid ...!!!
    UniformGrid possede 2 Dependencies Properties:
    - Rows et Columns fixant le nbre de colonnes et lignes generees auto par lui...
    - peut etre utilise comme ItemsPanel host dans un ListBox binde à un ObservableCollection<Cellule>..
    Tout est si simple ...
    Comme ItemsSource est binde à une liste "plate" ObservableCollection<Cellule> ,pour retrouver un objet Cellule situe à position donnee (I,J) ,il faut que le class Cellule store ces valeurs dans 2 props ....
    Au passage cela evite un array à 2 dimensions....
    A noter au passage que UniformGrid ne dispose pas(vu sa generation auto des cols et rows) de props attachees Grid.Column et Grid.Row !!!

    Voici un code exemple du ConwayGame (Version d'un AutomateCellulaire) qui illustre le propos:
    1/ code behind.cs du class Model Cellule
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel;
    using System.Windows;
     
    namespace WpfModelAnimation2
    {
        public class CelluleBase : INotifyPropertyChanged
        {
     
            public event PropertyChangedEventHandler PropertyChanged;
            public void RaisePropertyChanged(string propName)
            {
                PropertyChangedEventHandler h = PropertyChanged;
                if (h != null)
                    h(this, new PropertyChangedEventArgs(propName));
            }
        }
        public class Cellule:CelluleBase
        {
            private List<Cellule> Voisins;
     
     
            #region public properties
                private string id;
                public string ID
                {
                    get { return id ; }
                    set { id = value; base.RaisePropertyChanged("ID"); }
                }
                private bool alive;
     
                public bool Alive
                {
                    get { return alive; }
                    set { alive = value; base.RaisePropertyChanged("Alive"); }
                }
     
                private int nbVoisins;
                public int NbVoisins
                {
                    get { return nbVoisins; }
                    set { nbVoisins = value; base.RaisePropertyChanged("NbVoisins"); }
     
                }
                private int col;
                public int Col
                {
                    get { return col; }
                    set { col = value; base.RaisePropertyChanged("Col"); }
                }
                private int row;
                public int Row
                {
                    get { return row; }
                    set { row = value; base.RaisePropertyChanged("Row"); }
                }
     
            #endregion
     
            #region methods
                public Cellule()
                {
                    ID = string.Empty;
                    Alive = false;
                    Col = 0;
                    Row = 0;
                    Voisins = new List<Cellule>();
                }
                public Cellule(int pcol, int prow)
                    : this()
                {
                    Col = pcol;
                    Row = prow;
                }
                public void ClearVoisins()
                {
                    Voisins = new List<Cellule>();
                }
     
                public void AddVoisin(Cellule oCell)
                {
                    if (Voisins == null) Voisins = new List<Cellule>();
     
                    Voisins.Add(oCell);
                }
                public void RazNbreVoisins()
                {
                    NbVoisins = 0;
                }
                public void MajNbreVoisinsSiAlive()
                {
     
     
                    if (this.Alive)
                        foreach (Cellule oCell in Voisins)
                            oCell.NbVoisins += 1;
     
     
                }
                public void MajAliveSuivantNbreVoisins()
                {
                    if (!this.Alive)
                    {
                        //  resurrection si 3 voisins
                        this.Alive = (NbVoisins == 3);
                    }
                    else
                    {
                        // maintiont en vie , si 2 or 3 voisins
                        this.Alive = (NbVoisins == 2 || NbVoisins == 3);
                    }
                }
     
                public void OnMouseDown()
                {
                    this.Alive = true ;
                }
           #endregion
        }
     
     
    }
    2/ code behind.cs du class ViewModel ConwayGame
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections.ObjectModel;
    using System.Windows.Threading;
     
    namespace WpfModelAnimation2
    {
        public class ConWayGame:CelluleBase 
        {
            #region private fields
                private bool bSetupVoisins ;
     
            #endregion
            #region protected  fields
                protected Random rnd;
            #endregion
            #region public properties
     
                private ObservableCollection<Cellule > cells;
                public ObservableCollection<Cellule>  Cells
                {
                    get { return cells; }
                    set { 
                        cells = value;
                        base.RaisePropertyChanged("Cells"); }
                }
     
                private int cols;
                public int Cols
                {
                    get { return cols=16; }
                    set { cols = value; base.RaisePropertyChanged("Cols"); }
                }
                private int rows ;
     
                public int Rows
                {
                    get { return rows; }
                    set { rows = value; base.RaisePropertyChanged("Rows"); }
                }
     
                private int generationCount;
                public int GenerationCount
                {
                    get { return generationCount; }
                }
                private double tempsEcoule;
                public double TempsEcoule
                {
                    get { return tempsEcoule; }
                }
            #endregion
     
            #region methods
     
                public ConWayGame()
                {
     
                    Rows = 18;
                    Cols = 18;
                    rnd = new Random();
                    Cells = new ObservableCollection<Cellule>(); 
                    CreateData();
                }
     
                private void CreateData()
                {
                    Cellule oc;
                    int colOc = 0;
                    int rowOc = 0;
     
                    for (rowOc = 0; rowOc < Rows; rowOc++)
                    {
                        for (colOc = 0; colOc < Cols; colOc++)
                        {
                            oc = this.CreateCellule(colOc, rowOc);
                            Cells.Add(oc);
                            oc.ID = Cells.IndexOf(oc).ToString();
                        }
                    }
     
                    Rows = rowOc;
                    Cols = colOc;
                    generationCount = 0;
     
                }
     
     
                protected Cellule CreateCellule(int col, int row)
                {
                    bSetupVoisins = false;     //Nouvelle  cellule , voisins non iNITIALISE
     
                    Cellule oCell = new Cellule( col,row);
                    oCell.Alive = PileFace();
                    return oCell;
                }
                //methode  pile ou face (50% chances  en vie ou mort)
                protected bool PileFace()
                {
                    return rnd.Next(0, Int16.MaxValue) % 2 == 0;
                }
     
     
                public void Tick(double t)
                {
                    try
                    {
     
                        RunGeneration();
                        generationCount += 1;
                    }
                    finally
                    {
                        tempsEcoule = t;
     
                    }
                }
                protected void RunGeneration()
                {
     
                    if (! bSetupVoisins) SetupVoisins();
     
     
                    //  3  passes ordonees car une passe peut affecter une autre
     
                    // 1- clear nbre voisins
                    foreach (Cellule oC in Cells)
                        oC.RazNbreVoisins();
     
     
                    // 2- Maj Nbre  voisins si cellule Alive
                    foreach (Cellule oC in Cells)
                        oC.MajNbreVoisinsSiAlive();
     
                    // 2- MAj cellule suivant nbre voisins(resurrection)
                    foreach (Cellule oC in Cells)
                        oC.MajAliveSuivantNbreVoisins();
     
     
     
                }
     
                private void SetupVoisins()
                {
     
                    int rowOc = 0;
                    int colOc = 0;   
                    int rowVoisin = 0;
                    int colVoisin = 0;   
     
                    Cellule oCellVoisin = null;
     
                    Cellule oc = null;
                    for (int i = 0; i < Cells.Count; i++)
                    {
                        oc = Cells[i];
                        oc.ClearVoisins();
                        rowOc = oc.Row;
                        colOc = oc.Col;
                        for (rowVoisin = -1; rowVoisin <= 1; rowVoisin++)
                        {
                            for (colVoisin = -1; colVoisin <= 1; colVoisin++)
                            {
                                if (rowVoisin == 0 && colVoisin == 0)
                                {  //cellule en cours ;
                                }
                                else
                                {
                                    oCellVoisin = Cells.Where(
                                        p => p.Row == (rowOc + rowVoisin) && p.Col == (colOc + colVoisin)).FirstOrDefault();
                                    if (oCellVoisin != null) oc.AddVoisin(oCellVoisin);
                                }
                            }
                        }
                    }
     
                   bSetupVoisins = true;
               }
            #endregion
     
     
        }
    }
    3/ code xaml du View ( UserControl )
    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
     
    <UserControl x:Class="WpfModelAnimation2.UserControl1"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:WpfModelAnimation2" 
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        <UserControl.Resources>
            <local:ConWayGame x:Key="conway"></local:ConWayGame>
            <Style x:Key="styleBtn" TargetType="{x:Type Button}">
                <EventSetter Event="Click" Handler="OnCellClick"/>
            </Style>
            <DataTemplate 
                x:Key="celluleTemplate"
                DataType="{x:Type local:Cellule}">
                <Button 
                    x:Name="btnCell"
                    Margin="5" 
                    Width="75"
                    Height="25"
                    Content="{Binding ID}"
                    FontSize="14"
                    Foreground="Black"  
                    Style="{StaticResource styleBtn}"
                   >
                </Button>
                <DataTemplate.Triggers>
                    <DataTrigger  Binding="{Binding Path=Alive}" Value="false">
                        <Setter TargetName="btnCell" Property="Background"    Value="Red"/>
                    </DataTrigger>
                    <DataTrigger  Binding="{Binding Path=Alive}" Value="true">
                        <Setter TargetName="btnCell" Property="Background"    Value="Yellow"/>
                    </DataTrigger>
                </DataTemplate.Triggers>
     
            </DataTemplate>
        </UserControl.Resources>
        <Grid >
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"></RowDefinition>
                <RowDefinition Height="auto"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>
     
            <DockPanel 
                Grid.Row="0"  x:Name="pnlLabels" >
                <Label 
                    Margin="5"  HorizontalAlignment="Left" 
                    Background="Beige"  Width="120"
                    x:Name="lblGenerationCount" Content="..."/>
                <Label
                    Margin="5" HorizontalAlignment="Left"  
                    Background="Beige"  Width="120" 
                    x:Name="lblTempsEcoule" Content="..." />
            </DockPanel>
     
            <DockPanel
                Grid.Row="1" x:Name="pnlButtons">
                <Button Margin="5" HorizontalAlignment="Left" Background="AliceBlue"
                        Width="120"
                    x:Name="btnRun" Content="Run" Click="btnRun_Click" />
                <Button Margin="5"  HorizontalAlignment="Left" 
                        Background="AliceBlue" Width="120"
                    x:Name="btnStop" Content="Stop " Click="btnStop_Click" />
            </DockPanel>
     
            <Border 
                Grid.Row="2" 
                BorderBrush="RoyalBlue" BorderThickness="4">
                <ListBox 
     
                    x:Name="lb"
                    ItemTemplate="{StaticResource celluleTemplate}"
                    ItemsSource="{Binding Source={StaticResource conway}, Path=Cells}">
                    <!--note le binding au nbre de colonnes Cols de UniformGrid.
                    Suffisant  pour determiner ses Rows -->
                    <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <UniformGrid IsItemsHost="True" Columns="{Binding Path=Cols}" />
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>
     
                </ListBox>
            </Border>
        </Grid>
     
    </UserControl>
    4/ code behind .cs du View ( UserControl )
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Windows.Threading;
     
    namespace WpfModelAnimation2
    {
        /// <summary>
        /// Logique d'interaction pour UserControl1.xaml
        /// </summary>
        public partial class UserControl1 : UserControl
        {
            DispatcherTimer frameTimer;
     
            private int lastTick;
            private int currentTick;
            private double elapsed;
            private double totalElapsed;
     
     
            //
            private ConWayGame conway = null;
            public UserControl1()
            {
                InitializeComponent();
                frameTimer = new DispatcherTimer();
                frameTimer.Tick += new EventHandler(frameTimer_Tick);
                frameTimer.Interval = TimeSpan.FromSeconds(10.0 / 60.0);
                conway = this.FindResource("conway") as ConWayGame;
            }
     
            void frameTimer_Tick(object sender, EventArgs e)
            {
                // Calcul frame time;
                this.currentTick = Environment.TickCount;
                this.elapsed = (double)(this.currentTick - this.lastTick) / 1000.0;
                this.totalElapsed += this.elapsed;
                this.lastTick = this.currentTick;
     
     
                conway.Tick(this.totalElapsed);
                this.lblGenerationCount.Content = conway.GenerationCount.ToString();
                this.lblTempsEcoule.Content = conway.TempsEcoule.ToString();
            }
     
            private void btnRun_Click(object sender, RoutedEventArgs e)
            {
                frameTimer.Start();
                this.lastTick = Environment.TickCount;
            }
            private void btnStop_Click(object sender, RoutedEventArgs e)
            {
                this.frameTimer.Stop();
     
                //reinitialse conway
                conway = new ConWayGame();
                this.lb.ItemsSource = conway.Cells;
                this.lblGenerationCount.Content  = conway.GenerationCount.ToString();
                this.lblTempsEcoule.Content = conway.TempsEcoule.ToString();
     
            }
     
            private void OnCellClick(object sender, RoutedEventArgs e)
            {
                Button b = (sender as Button);
     
                Cellule oc =(Cellule) b .DataContext;
                oc.OnMouseDown();
            }
     
     
     
     
     
        }
    }
    5/simplistic code xaml du form MainWindow (pas de code behind)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <Window x:Class="WpfModelAnimation2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfModelAnimation2" 
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <local:UserControl1></local:UserControl1>
        </Grid>
    </Window>
    A noter qu'un DispatcherTimer est utilisé dans le UserControl pour rythmer la génération du moteur du ModelView ConwayGame...!!!

    Pour gagner en performance une autre methode est d'utiliser une liste de DrawingVisuals "children" d'un Custom FrameworkElement ...
    Cela bien sur necesitte de "placer" les DrawingVisuals manuellement à la mode "gdi" et intergagir avec eux à l'aide de VisualTreeHelper !!!
    bon code...

Discussions similaires

  1. JavaScript pour Photoshop cs2 - Faire une grille d'image pour tirages
    Par spaceodity dans le forum Général JavaScript
    Réponses: 26
    Dernier message: 27/12/2009, 16h02
  2. Réponses: 7
    Dernier message: 03/08/2009, 15h06
  3. Faire une grille avec SDL
    Par holdboy dans le forum SDL
    Réponses: 13
    Dernier message: 26/12/2008, 19h47
  4. Faire une grille...
    Par Spack dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 14/05/2006, 21h46
  5. [Debutant(e)]Quel composant utiliser pour faire une grille
    Par elitost dans le forum Composants
    Réponses: 7
    Dernier message: 21/06/2004, 20h44

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