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 ! )