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

C++Builder Discussion :

TScrollBar et jlistBox d'images


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut TScrollBar et jlistBox d'images
    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
    //---------------------------------------------------------------------------
     
     
    #pragma hdrstop
     
    #include "jListBox.h"
     
    //---------------------------------------------------------------------------
     
    #pragma package(smart_init)
     
    __fastcall jListBox::jListBox(TComponent *Owner, TImage *BG)
    	: TCustomControl(Owner)
    {
    	if(Owner->InheritsFrom(__classid(TWinControl)))
    	{
    		Parent = (TWinControl*)Owner;
    		BringToFront();
    	}
    	//Lien vers l'image d'arrière plan
    	BackGround = BG;
     
    	//Création d'un scrollbar pour le défilement des items
    	ScrollBar = new TScrollBar(this);
    	ScrollBar->Kind = sbVertical;
    	ScrollBar->Align = alLeft;
    	ScrollBar->Max = 30;
    	ScrollBar->OnChange = WhenScroll;
    	ScrollBar->Parent = this;
    	FItemIndex = -1;
     
    	Items = new TStringList;
     
    	OnMouseDown = WhenMouseDown;
    }
    //--
     
    __fastcall jListBox::~jListBox()
    {
    	Items->Clear();
    	delete Items;
    }
    //--
     
    void __fastcall jListBox::Paint()
    {
    	Canvas->Brush->Style = bsClear;
    	//Quelques variables
    	int we = Width;
    	int he = Height;
    	TRect Dest = Rect(0,0,we,he);
    	TRect Srce;
     
    	//Calcul des coordonnées de la portion d'image en arrière plan
    	Srce.Left = Left - BackGround->Left;
    	Srce.Top = Top - BackGround->Top;
    	Srce.Right = Srce.Left + we;
    	Srce.Bottom = Srce.Top + he;
     
    	//Copie du fond
    	Canvas->CopyRect(Dest, BackGround->Picture->Bitmap->Canvas, Srce);
    	Canvas->Font->Color = clBlack; //<<< Ici ça dépend !
     
    	//Ecriture des items
    	MaxItems = he / 16;
    	int item;
    	for(int j = 0; j < MaxItems; j++)
    	{
    		item = j + FTopIndex;
    		if(item < Items->Count)
    		{
    			if(item == FItemIndex)Canvas->Font->Style = Canvas->Font->Style << fsBold;
    			else Canvas->Font->Style = Canvas->Font->Style >> fsBold;
    			Canvas->TextOut(4, j * 16, Items->Strings[item]);
    		}
    	}
    	//Contour 3D
    	/*Canvas->Pen->Color = clWhite;
    	Canvas->MoveTo(0,he); Canvas->LineTo(0,0); Canvas->LineTo(we,0);
    	Canvas->Pen->Color = clBlack;
    	we--; he--;
    	Canvas->MoveTo(0,he); Canvas->LineTo(we,he); Canvas->LineTo(we,0);*/
    }
     
    void __fastcall jListBox::Add(AnsiString N)
    {
    	Items->Add(N);
    	ScrollBar->Max = Items->Count-1;
    	Repaint();
    }
     
    void __fastcall jListBox::AssignItems(TStrings *Source)
    {
    	Items->Assign(Source);
    	ScrollBar->Max = Items->Count-1;
    	Repaint();
    }
     
    void __fastcall jListBox::WhenScroll(TObject *Sender)
    {
    	FTopIndex = ScrollBar->Position;
    	Repaint();
    }
     
    void __fastcall jListBox::WhenMouseDown(TObject *Sender, TMouseButton Button,
                                    TShiftState Shift, int X, int Y)
    {
    	int n = Y / 16;
    	if(n < MaxItems)
    	{
    		n = n + FTopIndex;
    		if(n < Items->Count)
    		{
    			ItemIndex = n;
    		}
    	}
    }
     
    void __fastcall jListBox::SetItemIndex(int Value)
    {
    	FItemIndex = Value;
    	Repaint();
    }
     
    void __fastcall jListBox::SetTopIndex(int Value)
    {
    	if((Value >= 0) && Value < (Items->Count-1))
    	{
    		ScrollBar->Position = Value;
    		FTopIndex = Value;
    		Repaint();
    	}
    }
    Bonjour a tous,
    J'essaie depuis qq temps maintenant de rendre scrollable cette fameuse classe. elle contient des TImages de 60 de haut. et, si la scrollbar s'affiche bien, elle n'a aucun effet. D'ailleurs, la scrollbar s'affiche qu'on en ai besoin ou non.

    Donc si vous pouviez m'aider à la rendre scrollable, j'en serai ravi.

    Merci.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Je ne pense pas qu'à l'origine cette classe ait pu être proposée pour faire défiler des images mais juste pour faire défiler du texte sur un fond d'image pour créer une illusion de transparence !
    Dans ce cas précis, le défilement de l'arrière plan n'était qu'anecdotique au sens où il ne dépendait que de la position de l'objet sur l'image !
    La scrollbar n'avait rien à voir avec le fond, mais juste avec le texte !

    Donc ... que cherches tu à faire ?

    A plus !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    Désolé, je me suis mal exprimé apparemment.

    Cette classe permet d'avoir une listbox avec fond transparent. Grace à l'aide qu'on a pu m'apporter il y a quelques temps sur le forum, j'ai pu ajouter a cette listbox des items TImage.

    J'ai donc actuellement une Listbox au fond transparent et dont les items sont des TImages. Mon problème survient en fait quand le nombre d'item (qui ont tous les dimensions suivantes: h=60, l=300) est supérieur à 4. En effet, ma listbox n'étant pas assez grande, les items superieurs a l'index 4 ne sont pas visibles. Pour cela, j'aimerais comme avec les listbox de texte pouvoir scroller la listebox.

    J'espere que tu verras mieux ce que je veux dire. Merci de t'interesser a mon problème.

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    modifier >> ScrollBar->Align = alRight;

    Virer les méthodes Add et AssignItems que l'on remplace par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void __fastcall AddObject(AnsiString N, Graphics::TBitmap *Image);
    J'ai renommé la classe en jListImageBox ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void __fastcall jListImageBox::AddObject(AnsiString N, Graphics::TBitmap *Image)
    {
    Items->AddObject(N, Image);
    ScrollBar->Max = Items->Count-1;
    Repaint();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Juste au dessus de la déclaration de la classe, dans son .h
    #define hauteur_image 60
    Dans la méthode Paint, on rajoute un peu de 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
     
    //Ecriture des items
    MaxItems = he / hauteur_image;
    int item;
    for(int j = 0; j < MaxItems; j++)
        {
        item = j + FTopIndex;
        if(item < Items->Count)
            {
            Canvas->Draw(0, j * hauteur_image, (Graphics::TBitmap*)Items->Objects[ item] );
            // if(item == FItemIndex)Canvas->Font->Style = Canvas->Font->Style << fsBold;
            // else Canvas->Font->Style = Canvas->Font->Style >> fsBold;
            // Canvas->TextOut(4, j * 16, Items->Strings[item]);
    	}
        }
    Pour cette modification je supprime l'écriture du texte pour ne retenir que le dessin des rubans.

    J'ai conservé l'illusion de la transparence.

    Pour le dessin du texte... je pense que tu pourrais éventuellement en faire un peu !
    On peut bien sûr rajouter un tas de propriétés comme par exemple pour fixer une convention sur la hauteur des rubans (fixe ou variable en fonction de celle des images )
    Je n'ai ni le temps ni l'envie d'aller plus loin !

    Voici comment j'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jListImageBox *ListImageBox;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //Dans le constructeur de TForm1 :
    ListImageBox = new jListImageBox(this, Trifide);
    ListImageBox->AddObject("Item 1", Image1->Picture->Bitmap);
    ListImageBox->AddObject("Item 2", Image2->Picture->Bitmap);
    ListImageBox->AddObject("Item 3", Image3->Picture->Bitmap);
    ListImageBox->AddObject("Item 4", Image4->Picture->Bitmap);
    ListImageBox->AddObject("Item 5", Image5->Picture->Bitmap);
    ListImageBox->AddObject("Item 6", Image6->Picture->Bitmap);
    ListImageBox->AddObject("Item 7", Image1->Picture->Bitmap);
    ListImageBox->AddObject("Item 8", Image2->Picture->Bitmap);
    ListImageBox->AddObject("Item 9", Image3->Picture->Bitmap);
    ListImageBox->AddObject("Item 0", Image4->Picture->Bitmap);
    ListImageBox->SetBounds(100,100,100, 4 * hauteur_image);
    La trifide ... est en 640 * 480 quant aux six images ce sont celles de textures perso !
    Et ... chez moi, .... ça scroll !

    A plus !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    parfait merci. Je test ca et je reviens pour confirmer si tout fonctionne.

    [Edit] Je suis désolé mais je n'arrive pas du tout a faire fonctionner le systeme.

    Voici le contenu du .h et cpp de la classe:
    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
    //---------------------------------------------------------------------------
     
    #ifndef jListBoxH
    #define jListBoxH
    #include <StdCtrls.hpp>
    #include <ExtCtrls.hpp>
    #define hauteur_image 65
     
    //---------------------------------------------------------------------------
    class jListBox : public TCustomControl
    {
    	private:
    		TScrollBar *ScrollBar; //pour le défilement des items
    		int MaxItems; //nombre d'items dessinés
    		int FItemIndex; //Item sélectionné
    		int FTopIndex; //code du premier item affiché (== ScrollBar->Position)
     
    	protected:
    		//Méthodes permettant de fixer la valeur des propriétés afin
    		//d'associer le rafraîchissement de l'objet à chaque modification
    		void __fastcall SetItemIndex(int Value);
    		void __fastcall SetTopIndex(int Value);
     
    	public:
    		TImage *BackGround; //l'image en arrière plan
    		TStringList *Items; //la liste des chaines
     
    		__fastcall jListBox(TComponent *Owner, TImage *BG);
    		__fastcall ~jListBox();
     
    		//Surcharge de la méthode Paint
    		void __fastcall Paint();
     
    		//Pour ajouter un item à la stringlist
    		void __fastcall AddObject(AnsiString N, Graphics::TBitmap *Image);
     
    		//Pour le défilement des items (OnChange de la ScrollBar)
    		void __fastcall WhenScroll(TObject *Sender);
     
    		//Pour la sélection d'un item (OnMouseDown de l'objet)
    		void __fastcall WhenMouseDown(TObject *Sender, TMouseButton Button,
    									TShiftState Shift, int X, int Y);
     
    		//Propriétés
    		__property int ItemIndex = {read=FItemIndex, write=SetItemIndex};
    		__property int TopIndex = {read=FTopIndex, write=SetTopIndex};
    };
    #endif
    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
    //---------------------------------------------------------------------------
     
     
    #pragma hdrstop
     
    #include "jListBox.h"
     
    //---------------------------------------------------------------------------
     
    #pragma package(smart_init)
     
    __fastcall jListBox::jListBox(TComponent *Owner, TImage *BG)
    	: TCustomControl(Owner)
    {
    	if(Owner->InheritsFrom(__classid(TWinControl)))
    	{
    		Parent = (TWinControl*)Owner;
    		BringToFront();
    	}
    	//Lien vers l'image d'arrière plan
    	BackGround = BG;
     
    	//Création d'un scrollbar pour le défilement des items
    	ScrollBar = new TScrollBar(this);
    	ScrollBar->Kind = sbVertical;
    	ScrollBar->Align = alLeft;
    	ScrollBar->Max = 0;
    	ScrollBar->OnChange = WhenScroll;
    	ScrollBar->Parent = this;
    	FItemIndex = -1;
    	Items = new TStringList;
     
     
    	OnMouseDown = WhenMouseDown;
    }
    //--
     
    __fastcall jListBox::~jListBox()
    {
    	Items->Clear();
    	delete Items;
    }
    //--
     
    void __fastcall jListBox::Paint()
    {
    	Canvas->Brush->Style = bsClear;
    	//Quelques variables
    	int we = Width;
    	int he = Height;
    	TRect Dest = Rect(0,0,we,he);
    	TRect Srce;
     
    	//Calcul des coordonnées de la portion d'image en arrière plan
    	Srce.Left = Left - BackGround->Left;
    	Srce.Top = Top - BackGround->Top;
    	Srce.Right = Srce.Left + we;
    	Srce.Bottom = Srce.Top + he;
     
    	//Copie du fond
    	Canvas->CopyRect(Dest, BackGround->Picture->Bitmap->Canvas, Srce);
    	Canvas->Font->Color = clBlack; //<<< Ici ça dépend !
     
    	//Ecriture des items
    	MaxItems = he / hauteur_image;
    	int item;
    	for(int j = 0; j < MaxItems; j++)
    	{
    		item = j + FTopIndex;
    		if(item < Items->Count)
    		{
    			Canvas->Draw(0, j * hauteur_image, (Graphics::TBitmap*)Items->Objects[ item] );
    			/*
    			if(item == FItemIndex)Canvas->Font->Style = Canvas->Font->Style << fsBold;
    			else Canvas->Font->Style = Canvas->Font->Style >> fsBold;
    			Canvas->TextOut(4, j * 16, Items->Strings[item]);*/
    		}
    	}
     
     
    	//Contour 3D
    	/*Canvas->Pen->Color = clWhite;
    	Canvas->MoveTo(0,he); Canvas->LineTo(0,0); Canvas->LineTo(we,0);
    	Canvas->Pen->Color = clBlack;
    	we--; he--;
    	Canvas->MoveTo(0,he); Canvas->LineTo(we,he); Canvas->LineTo(we,0);*/
    }
     
    void __fastcall jListBox::AddObject(AnsiString N, Graphics::TBitmap *Image)
    {
    	Items->AddObject(N, Image);
    	ScrollBar->Max = Items->Count-1;
    	Repaint();
     
    }
     
     
    void __fastcall jListBox::WhenScroll(TObject *Sender)
    {
    	FTopIndex = ScrollBar->Position;
    	Repaint();
    }
     
    void __fastcall jListBox::WhenMouseDown(TObject *Sender, TMouseButton Button,
                                    TShiftState Shift, int X, int Y)
    {
    	int n = Y / hauteur_image;
    	if(n < MaxItems)
    	{
    		n = n + FTopIndex;
    		if(n < Items->Count)
    		{
    			ItemIndex = n;
    		}
    	}
    }
     
    void __fastcall jListBox::SetItemIndex(int Value)
    {
    	FItemIndex = Value;
    	Repaint();
    }
     
    void __fastcall jListBox::SetTopIndex(int Value)
    {
    	if((Value >= 0) && Value < (Items->Count-1))
    	{
    		ScrollBar->Position = Value;
    		FTopIndex = Value;
    		Repaint();
    	}
    }
    et comment je l'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    _jlbServ = new jListBox(this, imgFond);
    		_jlbServ->SetBounds(imgFond->Left + 24, imgFond->Top + 112, 273, 297);
    		TImage * ban  = new TImage(this);
    		ban->Picture->LoadFromFile("./serveur/Darluok.jpg");
    		_jlbServ->AddObject("test",ban->Picture->Bitmap);

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Es-tu certain que TImage prenne en compte les fichiers *.jpg ?
    En faisant une recherche sur ce forum (mot clé : jpg)

    http://www.developpez.net/forums/d63...?highlight=jpg

    Il faudrait, je pense, ajouter à cette classe une propriété (juste un pointeur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private :
    TJPEGImage *pJpeg;
    Dans le constructeur on instancie l'objet (vérifier s'il lui faut un propriétaire):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pJpeg = new TJPEGImage();
    S'il n'a pas de propriétaire (je pense qu') il faudra le détruire dans le destructeur

    On peut ajouter une méthode qui va tout prendre en charge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void __fastcall LoadFromFile(AnsiString Filename);
    REM : ici, j'ai modifié le nom de la classe (pour ne pas confondre)

    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
     
    void __fastcall jListImageBox::LoadFromFile(AnsiString Filename)
    {
    //s'assurer que ...
    if(FileExists(Filename))
        {
        pJpeg->LoadFromFile(Filename);
     
        TImage *Image = new TImage(this);
        Image->Parent = this;
        Image->Visible = false;
        Image->Picture->Bitmap->Assign(pJpeg);
        //Un exemple pour extraire le nom du fichier qui servira d'item    
        //au cas où ...
        AnsiString N = ExtractFileName(Filename);
        N.SetLength(N.Length() - 4);
        AddObject(N, Image->Picture->Bitmap);
        }
    else
        {
        ShowMessage("Fichier introuvable");
        }
    }
    Ici, on rajoute des TImage (dont l'objet est le propriétaire) au gré des chargements.
    L'avantage est que leur destruction sera assurée par l'objet lui-même au moment de sa propre destruction.
    Chaque TImage détruira son propre bitmap... on a rien d'autre faire !

    Cependant on peut utiliser de simples bitmaps (Graphics::TBitmap en lieu et place de TImage) mais dans ce cas il faudra les détruire manuellement dans le destructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(int j = 0; j < Items->Count; j++)
        {
        delete (Graphics::TBitmap*)Items->Objects[j];
        }
    En fait, comme tu es dans la situation d'un concepteur, il te faut fixer les règles du jeu (pour l'utilisateur) et s'y tenir en particulier pour la destruction des bitmaps !
    Il faut que l'objet détruise ce qu'il crée mais surtout de pas détruire ce qu'il n'a pas créé !!!

    Je ne peux pas tester n'ayant pas sous la main la classe TJPEGImage !

    A plus !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Resize d'une image
    Par Anonymous dans le forum C
    Réponses: 6
    Dernier message: 13/07/2008, 22h23
  2. recherche des algorythmes pour images 2d
    Par exxos dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 24/05/2002, 13h46
  3. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11
  4. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 10h44
  5. Création image BMP
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 16h04

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