2009-12-11 6 views
1

Mon application dispose d'une fenêtre dans laquelle se trouve un ListBox rempli de texte qui change au fil du temps. Les entrées Listbox peuvent donc avoir plusieurs longueurs.Taille de la zone de liste déroulante en fonction de la longueur du texte

Je souhaite que la largeur de la fenêtre et de la zone de liste change dynamiquement en fonction de la longueur des entrées de la zone de liste (en nombre de caractères). Par exemple, si ma zone de liste contient plusieurs entrées et que la longueur maximale est de 30 caractères, je veux que la largeur de la fenêtre et de sa listbox soit supérieure à celle d'une fenêtre de 20 caractères.

Quelle est la meilleure façon de faire cela?

Répondre

0

Quelle plate-forme de programmation utilisez-vous? Je devine .NET et VB.

Mettre dans une méthode pour examiner le contenu de la liste et modifier la taille de la boîte et la fenêtre selon les besoins:

Dim intMaxLength As Integer = 20 
For Each myItem As String In ListBox1.Items 
    If Len(myItem) > intMaxLength Then 
     'Number of characters times number of pixels per character 
     ListBox1.Width = Len(myItem) * 10 
     'Me refers back to the form object 
     'Add a few extra pixels to give space around your listbox 
     Me.Width = Len(myItem) * 10 + 30 
    End If 
Next 

espère que cela vous donne un point de départ décent.

+0

MFC est non géré –

+0

C++ qui change tout. Je ne suis pas un gars C++. Peut-être que quelqu'un d'autre peut vous aider. ;) – Brad

1

Essayez quelque chose comme ceci:

// find the longest item 
CString longest; 
for (int i = 0; i < m_list.GetCount(); ++i) 
{ 
    CString temp; 
    m_list.GetText(i, temp); 
    if (temp.GetLength() > longest.GetLength()) 
     longest = temp; 
} 

// get the with of the longest item 
CSize size = GetWindowDC()->GetTextExtent(longest); 

// you need this to keep the current height 
RECT rect; 
m_list.GetWindowRect(&rect); 

// change only width 
int width = size.cx; 
int height = rect.bottom - rect.top; 
m_list.SetWindowPos(NULL, 0, 0, width, height, SWP_NOZORDER | SWP_NOMOVE); 
+0

Merci. Cela semble une bonne solution. Je vais essayer ça dès que je rentre à la maison. – eniac

+2

Vous pouvez appeler GetTextExtent sur chaque chaîne. Avec les polices proportionnelles, il est tout à fait possible qu'une chaîne courte soit plus large qu'une chaîne plus longue. –

+0

Vous devez vous assurer que vous utilisez le contexte de périphérique de la listbox, c'est-à-dire "m_list.GetWindowDC()" au lieu de "GetWindowDC()". Aussi, pour mesurer le texte en utilisant la police actuelle de la liste, au lieu de la police système par défaut, vous aurez besoin de "m_list.GetWindowDC(). SelectObject (m_list.GetFont())" aussi. – ulatekh

0

Essayez ceci:

int maxcol = ((CHeaderCtrl*)(listctrl.GetDlgItem(0)))->GetItemCount()-1; 
for (int col = 0; col <= maxcol; col++) 
{ 
    listctrl.SetColumnWidth(col, LVSCW_AUTOSIZE_USEHEADER); 
} 
Questions connexes