Faire un assemblage d'images

Résolu
Siteauludo Messages postés 60 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 15 mai 2007 - 2 oct. 2006 à 20:38
Siteauludo Messages postés 60 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 15 mai 2007 - 4 oct. 2006 à 14:43
Bonjour,

J'aimerai faire, en fait, une sorte de logiciel qui remplace une chaîne de caractères par une "chaîne d'images", soit une suite d'images.

par exemple, la chaîne de caractères :
abeoc

deviendrait :
[img1][img2][img3][img4][img5]

Pour cela je pourrais utiliser un richtextbox, mais, bien sûr, il y a un détail :

Je dois pouvoir décaler individuellement les images vers le haut ou le bas.

Par exemple, faire en sorte que [img2] soit 2 pixels plus haut que [img1], et que [img3] soit 2.3 pixels plus bas que [img2], etc...

Une idée d'un contrôle qui ferait ça ?

Au pire, je peux toujours mettre des tas de imageBox (je suis plus sûr du nom, le contrôle qui affiche une image), et faire un screen du tout, mais se serait incroyablement gourmand en ressource (mes chaînes de caractères pouvant être très longues...)

Un idée géniale ?

Merci d'avance, Siteauludo

6 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
3 oct. 2006 à 10:02
Salut, je ne suis pas sûr de bien visualiser ce que tu veux..  Plutôt que d'utiliser plusieurs PictureBox créer une classe "Sprite" par exemple, qui contient l'image et sa position et dessine directement sur la forme ou le contrôle.

public struct Sprite
{
    private Bitmap bmp;
    private Color mask;
    private Rectangle bounds;


    public Rectangle Bounds { get { return bounds; } }


    public Sprite( Bitmap bmp, Rectangle bounds )
    {
        this.bmp = bmp;
        this.bounds = bounds;
        this.mask = bmp.GetPixel( 0, 0 );
    }


    public void Draw( Graphics g )
    {
        if ( bmp != null )
            g.DrawImage( bmp, bounds );
    }


    public bool Hit( int x, int y )
    {
        if ( bounds.Contains( x, y ) )
        {
            x = x - bounds.X;
            y = y - bounds.Y;
           
            if ( bmp.GetPixel( x, y ) != mask )
                return true;
        }
       
        return false;
    }
}
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
4 oct. 2006 à 07:24
Bounds contient la position du sprite en coordonnées client de la forme ainsi que ça taille, ça permet de dessiner le sprite et aussi de passer la position de la souris à la methode Hit pour savoir si la souris se trouve sur le sprite tout en tenant compte d'une couleur invisible via la variable mask ( un fond vert par exemple ).

Un exemple pour utiliser cette structure :

public sealed class MainForm : Form
{
    private List< Sprite > sprites = new List< Sprite >( );


    public MainForm( ) : base( )
    {
        this.SetStyle
        (
            ControlStyles.UserPaint |
            ControlStyles.DoubleBuffer |
            ControlStyles.AllPaintingInWmPaint,
            true
        );
       
        sprites.Add( new Sprite( new Bitmap( "image1.bmp" ), new Rectangle( 0, 0, 64, 64 ) ) );
        sprites.Add( new Sprite( new Bitmap( "image2.bmp" ), new Rectangle( 100, 100, 64, 64 ) ) );
    }


    protected override void OnMouseDown( MouseEventArgs e )
    {
        //base.OnMouseDown( e );


        if ( e.Button == MouseButtons.Left )
        {
            foreach( Sprite s in sprites )
            {
                if ( s.Hit( e.X, e.Y ) )
                    MessageBox.Show( "Hit !" );
            }
        }
    }


    protected override void OnPaint( PaintEventArgs e )
    {
        //base.OnPaint( e );


        Graphics g = e.Graphics;


        foreach( Sprite s in sprites )
            s.Draw( g );
    }


    [ STAThread ]
    private static void Main( )
    {
        Application.EnableVisualStyles( );
        Application.Run( new MainForm( ) );
    }
}
3
Siteauludo Messages postés 60 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 15 mai 2007
2 oct. 2006 à 20:40
Précision :


"Au pire, je peux toujours mettre des tas de imageBox "

ça veut dire que je pourrait faire une form spéciale qui ferait que de me générer des imageBox (!), une pour chaque image, et me les places individuellement sur elle-même (sur la form donc).
0
Siteauludo Messages postés 60 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 15 mai 2007
3 oct. 2006 à 17:44
Merci, ceci me sera fort pratique

Si j'ai bien compris, ça me placera une image bmp dans ma forme.

Par contre je ne comprends pas super bien le deuxième paramètres :

public Sprite( Bitmap bmp, Rectangle bounds )

C'est quoi ce Rectangle bounds ?

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Siteauludo Messages postés 60 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 15 mai 2007
3 oct. 2006 à 17:49
Edit: dans ma form
0
Siteauludo Messages postés 60 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 15 mai 2007
4 oct. 2006 à 14:43
Merci beaucoup !
0
Rejoignez-nous