Faire un assemblage d'images

[Résolu]
Signaler
Messages postés
60
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
15 mai 2007
-
Messages postés
60
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
15 mai 2007
-
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

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
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;
    }
}
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
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( ) );
    }
}
Messages postés
60
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
15 mai 2007

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).
Messages postés
60
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
15 mai 2007

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
Messages postés
60
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
15 mai 2007

Edit: dans ma form
Messages postés
60
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
15 mai 2007

Merci beaucoup !