Bonjour,
Je souhaite rendre le fond d'un TListBox transparent, mais impossible de trouver un problème semblable sur google où le forum...:?
J'espère que c'est possible..
Merci à tous,
FluidBlow
Version imprimable
Bonjour,
Je souhaite rendre le fond d'un TListBox transparent, mais impossible de trouver un problème semblable sur google où le forum...:?
J'espère que c'est possible..
Merci à tous,
FluidBlow
Salut !
Je pense que le sujet a déjà été abordé sur ce forum mais je n'ai pas réussi à le retrouver.
En fait, ça dépend de ce qu'il y a sous l'objet.
Sans doute à l'aide de la méthode OnDrawItem... sinon créer un nouveau composant...
A plus !
Bonjour,
Sous le TListBox, il y a un TImage...
Si il n'est pas possible de mettre un fondd transparent, serait-il possible de mettre une image 32 bits en fond alors ?
Merci d'avance.
FluidBlow
Salut !
Si le ListBox se dessine sur l'image (sans déborder) il est possible de récupérer l'image en arrière plan, bouts par bouts et de dessiner chaque bout dans le ListBox lors des OnDrawItem.
Par contre... ça doit être assez délicat à cause des couleurs de l'image qui pourraient perturber la lisibilité du texte.
Dès que j'en aurai le temps je ferai un test.
En attendant, tu as tout pour dessiner sur le Listbox grace aux paramètres de la méthode OnDrawItem.
Il faut juste calculer les coordonnées des bouts d'images sur l'image d'arrière plan.
Faire une recherche sur le forum BCB : OnDrawItem sinon voir l'aide.
A plus !
Bonsoir,
Merci beacoup de cotre aide qui m'est très précieuse.
Pour ce qui est de voir lisiblement les items, pas de problèmes, c'est prévu pour, un fond clair, léger dégradé.
Mais je vais me mettre au boulot pour essayer de faire ce que tu m'as dit.
Encore merci pour tout!
Cordialement,
FluidBlow
Bonjour,
Je n'ai pas réussi à trouver ce qui pourrait me permettre de découper une partie de l'image et de la remettre en fond du TList Box, mais peut etre qu'il faudrait utiliser ceci pour assigner l'image non ?
Et plus précisement un truck du genreCode:ListBox1->Canvas->Brush->Bitmap->
Mais je ne vois pas très bien ce que je peux faire sinon.Code:ListBox1->Canvas->Brush->Bitmap->LoadFromClipboardFormat();
Cordialement,
FluidBlow
Salut !
Avec un TListBox, ça ne fonctionne bien que si on affiche un nombre d'items tel que le cadre soit comlètement rempli.
Je n'ai pas réussi à trouver le moyen de remplir le bas du cadre.
Je pense que le mieux est de développer un objet dédié, soit à partir d'un TPaintBox soit à partir d'un TCustomControl, les items étant stockés dans un TStringList.
Ca représente quand même pas mal de travail pour simuler une transparence très localisée.
Il ne faut donc pas trop en demander pour ce qui en sera de la transparence.
Il existe aussi une autre possibilité, à l'aide de labels... rafraichis lors du OnChange d'un ScrollBar placé à gauche des labels...
Sinon, j'ai développé une classe en dérivant de TCustomControl.
A plus !
Bonjour,
Merci encore de votre aide, mais j'ai peur de ne pas avoir tout compris :?
Donc il faudrait que j'utilise un autre élèment qu'un TListBox ?
Pas de problèmes mais alors qu'est ce que vous me proposez pour que ça soit la plus facile à gérer ?
Sachant que ma liste est mise à jour dynamiquement par cette ligne :
Merci encore !Code:
1
2
3
4 if(OpenDialog1->Execute()) { ListBox1->Items->Assign(OpenDialog1->Files); }
FluidBlow
Salut !
Je ne sais pas si ce qui suit peut te convenir :
Code:
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 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 Add(AnsiString N); //Pour assigner un ensemble de chaines void __fastcall AssignItems(TStrings *Source); //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}; };
Les méthodes :
Les méthodes Set pour les deux propriétésCode:
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 __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 = alRight; 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 = ScrollBar->Left; 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; } } }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 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(); } }
Tel que je l'ai testé :
Et pour reprendre ce que tu fais :Code:
1
2
3
4
5
6
7
8 jListBox *ListBox; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ListBox = new jListBox(this, Image1); ListBox->SetBounds(Image1->Left + 50, Image1->Top + 70, 192, 120); }
La transparence est simulée par rapport à une image en arrière plan et ne fonctionne que dans ce contexte précis.Code:
1
2
3
4
5
6 void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { if(OpenDialog1->Execute()) { ListBox->AssignItems(OpenDialog1->Files); }
J'ai passé outre certains tests dans les méthodes, car j'ai supposé que tout est valide.
A plus !
Bonjour,
Tout d'abord, merci pour tes ces efforts pour moi :)
Mais j'ai quelques petits problèmes pour cette partie :Il me dit : " [C++ Erreur ] Unit1.cpp(37): E2108 Utilisation impropre de typedef 'jListBox'Code:
1
2
3
4 if(OpenDialog1->Execute()) { jListBox->Items->Assign(OpenDialog1->FileName); }
:(
Et aussi, lors de la compilation (sans cette ligne de code), L'image de ma fiche n'apparait plus, ni dans le fond, ni dans le jListBox :cry:
Ce serait trop bête d'échouer si près du but :oops:
Merci beaucoup encore !
FluidBlow
Salut !
jListBox... c'est le nom de la classe... !!!
Donc, en fonction du nom donné au pointeur sur l'instance :
Mais surtout pour ajouter un item isolé :Code:
1
2
3 jListBox *ListBox; ListBox->Items->Add(OpenDialog1->FileName);//<<< envisageable
ouCode:ListBox->Add(OpenDialog1->FileName);
Mes méthodes ( Add et AssignItems) permettent d'assigner les chaînes mais surtout de redessine le resultat !Code:ListBox->AssignItems(OpenDialog1->Files);
A plus !
Bonsoir,
Malheureusement, ça ne fonctionne pas mieux, mis à part que je peux compiler sans erreurs.
Le problème survient à ce momment,J'ai mis cette ligne de code après ceciCode:ListBox->SetBounds(Image1->Left + 50, Image1->Top + 70, 192, 120);
Voici les images :Code:
1
2
3
4
5
6 TForm1 *Form1; jListBox *ListBox; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
Sans la ligne de code :
http://pix.nofrag.com/f0/9c/ddee11c2...36231877ae.jpg
Avec la ligne de code, sans fichiers dans la ListBox :
http://pix.nofrag.com/fa/a7/8bb85592...7ae3281fc4.jpg
Avec la ligne de code, avec fichiers dans la ListBox :
http://pix.nofrag.com/25/40/c6f77b46...494b4f35eb.jpg
Dans la dernière image, on peux voir qu'il y a des items vides à chaques fois...
Alors voilà, j'espère qu'une solution existe :cry:
En tout cas, merci pour tout ce que tu as déjà fait !
Cordialement,
FluidBlow
Salut !
L'exemple que j'ai donné ne vaut que pour un contexte simple où une jListBox s'affiche par dessus une TImage en simulant une transparence.
Si l'image, telle qu'on la voit sans la listbox, est un agglomérat d'objets, dans ce cas, la simulation de la transparence ne peut pas fonctionner.
A noter que j'ai utilisé l'image que tu as donné, sans aucun problème donc...
A plus !
Salut !
Avec la version BCB6, c'est peut-être une question de double buffering de la form ?
A plus !
Bonjour,
Je viens d'essayer en rajoutant cette lignejuste avantCode:DoubleBuffered=true;
Mais ça ne change rien :cry:Code:
1
2
3
4 //Création dynamique de l'objet ListBox = new jListBox(this, Image1); //son positionnement sur la form ListBox->SetBounds(Image1->Left + 50, Image1->Top + 70, 192, 120);
Cordialement,
FluidBlow
Salut !
Je viens de trouver d'où venait mon problème !
Il ne supporte pas les images JPG !!
Tout simplement, il fallait que je mette une image BMP !
Merci beaucoup pour tout ce que tu as fait !! ;)
Enfin résolu ! ^^
Encore merci,
FluidBlow