[C++] VISUAL: Listbox de taille variable??

VISUAL: Listbox de taille variable?? [C++] - Programmation

Marsh Posté le 04-10-2001 à 09:59:19    

Salut.
Voilà mon problème:
j´ai un tableau de strings de tailles diverses.
J´aimerais afficher une listbox avec ces strings pour que l´utilisateur puisse en choisir un.
 
Et la question: ;)
comment faire pour changer la taille de la listbox (elle sera ds sa propre fenêtre) pour l´adapter à la taille des strings??
Car si je met la Listbox avec l´éditeur de ressources je pourrais certes changer la taille de la fenêtre, mais la listbox bougera pas!!  :(  
 
HELP!! :)


---------------
Athlon64 s754 10*200MHz - R9800Pro - 512MB DDR200MHz - ZX6RR - Q2[SupOp] - Tutorial Video: multilangues, multisstitres
Reply

Marsh Posté le 04-10-2001 à 09:59:19   

Reply

Marsh Posté le 04-10-2001 à 10:02:19    

MoveWindow ne marche pas ?

Reply

Marsh Posté le 04-10-2001 à 11:06:08    

Si ça marche merci!! ;)
En fait j´aurais qu´à réagir au redimentionnement de fenêtre et à ajuster la taille de la listbox à la client area.. :)
 
Par contre pas moyen d´avoir un scroll horizontal sur une listbox?? :(
 
Et qqun a une idée pour savoir la taille nécesaire en connaissant les strings?? Ca risque d´être chiant car ça dépend de la fonte..

Reply

Marsh Posté le 04-10-2001 à 11:10:49    

Arf je suis vraiment pas sur, m'enfin dans les propertie de la list box dans l'editeur de ressources y'a un truc a cocher nomme "horizontal scroll".
 
 
mais bon, c'est peut etre un piege :D

Reply

Marsh Posté le 04-10-2001 à 11:29:42    

Pour info pour connaitre la taille d´un texte: GetTextExtentPoint32().. :)
 
Par contre oui il y a bien une option "horizontal scroll" mais ça marche pas sur une listbox.
Il faudrait un autre objet de remplacement.. Une idée qqun??

Reply

Marsh Posté le 04-10-2001 à 11:44:06    

t'as essayer de jouer avec les SetScrollRange et tout ca ?

Reply

Marsh Posté le 04-10-2001 à 11:51:40    

Oui SetScrollRange() marche sur la barre verticale, mais la barre horizontale reste disablée qqe soit le scroll range..
 
Bouuuuuhh!! :-\

Reply

Marsh Posté le 04-10-2001 à 12:44:01    

En 16 bits (ça va aussi en 32), j'ai une listbox avec scroll horizontal...
 CONTROL "", IDINFOSP_COMM, "LISTBOX", LBS_NOTIFY | WS_BORDER | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL, 5, 90, 218, 46
 
J'ai été perplexe car y avait pas moyen de scroller quand le texte était (trop) long. Barre visible mais invalidée.
 
En fouillant dans la doc de BC 3.1 (vieux mais bien pour moi), je suis arrivé au fait qu'il faut envoyer le message LB_SETHORIZONTALEXTENT au ListBox pour lui donner la largeur effective du texte. Si plus grand que sa largeur, il "décide" de valider la barre.
 
Mon code donne alors (suis qu'amateur, y a sans doute à rédire  :))
     WORD   wLongest = 0;
 
       hdc = GetDC(hDlg);
       hFontOld = SelectObject(hdc, hFonte(0, 8, 0, FW_NORMAL, SERIF));
       do
       {
         Charge_bBuf_Avec_Chaine();
         // mesure taille des chaînes entrées pour savoir s'il faut valider
         // la barre de défilement horizontal
         #ifndef __FLAT__
  GetTextExtentPoint(hdc, (LPSTR)bBuf, strlen(bBuf), &size);
  #else
         GetTextExtentPoint32(hdc, (LPSTR)bBuf, strlen(bBuf), &size);
  #endif
  larg = size.cx;  
  if (larg > wLongest) wLongest = (WORD)larg;
  SendDlgItemMessage(hDlg, IDINFOSP_COMM, LB_ADDSTRING, 0, (LPARAM)bBuf);
  Incrémente pointeur
       } while (pasfini);
 
       // Applique largeur maxi de chaîne intégrée la plus longue
       SendDlgItemMessage(hDlg, IDINFOSP_COMM, LB_SETHORIZONTALEXTENT,
     (WPARAM)(wLongest + 8), 0L); // + 8 sinon trop juste
       SelectObject(hdc, hFontOld);                           hFonte(1, NULL, NULL, NULL, NULL);
       ReleaseDC(hDlg, hdc);
 
C'est pas toujours parfait (j'ai aussi une barre verticale qui joue peut-être). Le dernier caractère est des fois a demi-visible. Ajouter 60 au lieu de 8 ne semble pas améliorer les choses (on ne trompe pas un ListBox comme ça !  :D)

Reply

Marsh Posté le 04-10-2001 à 14:08:46    

Moi j´aime le forum programmation!!  :love:  
 
Effectivement CListBox::SetHorizontalExtent() existe!!
En fait la classe est juste trop paresseuse pour calculer la taille horizontale comme elle le fait pour la verticale..
 
Mais sinon un CListBox (C comme trente deuc bits ;) ) est bien plus sociable que son ancètre 16 bits: pas besoin de rajouter 8, il est même trop prudent comme ça!! ;)
 
Merci!! :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed