2009-12-11 4 views
1

Мое приложение имеет окно со списком ListBox, внутри которого заполняется текст, который изменяется со временем, поэтому записи в Listbox могут иметь длину несколько.Размер ширины списка в зависимости от длины текста

Я хочу, чтобы окно и ширина списка увеличивались динамически в зависимости от длины элементов списка (в количестве символов).

В качестве примера, если в моем списке есть несколько записей, а максимальная длина - 30 символов, я хочу, чтобы окно и его список больше ширины, чем одно окно, длина маякса которого составляет 20 символов.

Каков наилучший способ для этого?

ответ

0

Какую платформу программирования вы используете? Я предполагаю, что .NET и VB.

Put в способе проверить содержимое списка и изменить размер окна и окно в соответствии с требованиями:

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 

Надеется, что это дает вам достойную отправную точку.

+0

МФЦ неуправляемого C++ –

+0

Это все меняет. Я не парень на С ++. Может быть, кто-то может помочь вам. ;) – Brad

1

попробовать что-то вроде этого:

// 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

Спасибо. Это кажется хорошим решением. попробуй, как только я вернусь домой. – eniac

+2

Вы можете вызвать GetTextExtent для каждой строки. С пропорциональными шрифтами вполне возможно, что короткая строка будет более широкой, чем более длинная. –

+0

Вы хотите, чтобы вы использовали контекст устройства списка, т. Е. «M_list.GetWindowDC()» вместо «GetWindowDC()». Кроме того, чтобы измерить текст, используя текущий шрифт списка, вместо стандартного системного шрифта вам понадобится «m_list.GetWindowDC(). SelectObject (m_list.GetFont())» тоже. – ulatekh

0

Попробуйте это:

int maxcol = ((CHeaderCtrl*)(listctrl.GetDlgItem(0)))->GetItemCount()-1; 
for (int col = 0; col <= maxcol; col++) 
{ 
    listctrl.SetColumnWidth(col, LVSCW_AUTOSIZE_USEHEADER); 
} 
Смежные вопросы