列表框宽度大小与文本长度相关

Listbox width size dependent of text length

提问人:eniac 提问时间:12/12/2009 更新时间:12/13/2009 访问量:4665

问:

我的应用程序有一个窗口,里面有一个 ListBox,里面填充了随时间变化的文本,因此 Listbox 条目可以有多个长度。

我想使窗口和列表框宽度根据列表框条目长度(以字符数为单位)动态变化。

例如,如果我的列表框有多个条目,并且最大长度为 30 个字符,我希望使窗口及其列表框的宽度大于一个窗口的宽度,而 maixum 长度为 20 个字符。

最好的方法是什么?

MFC 宽度 ClistBox

评论


答:

0赞 Brad 12/12/2009 #1

您使用的是什么编程平台?我猜是 .NET 和 VB。

放入一种方法来检查列表的内容,并根据需要更改框和窗口的大小:

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赞 Brad 12/12/2009
这改变了一切。我不是C++的人。也许其他人可以帮助你。;)
1赞 Nikola Smiljanić 12/12/2009 #2

尝试这样的事情:

// 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 12/12/2009
谢谢。这似乎是一个不错的解决方案。我一回家就会尝试。
2赞 Mark Ransom 12/12/2009
您可能希望对每个字符串调用 GetTextExtent。使用比例字体,短字符串完全有可能比长字符串更宽。
1赞 ulatekh 10/22/2013
您需要确保使用列表框的设备上下文,即“m_list.GetWindowDC()“,而不仅仅是”GetWindowDC()”。此外,若要使用列表框的当前字体而不是默认系统字体来测量文本,则需要“m_list。GetWindowDC() 中。SelectObject(m_list。GetFont())”。
0赞 Stefan 12/13/2009 #3

试试这个:

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