2009-12-11 123 views
1

我的應用程序有一個帶有ListBox的窗口,其中充滿隨時間變化的文本,因此Listbox條目可以有多個長度。依賴於文本長度的列表框寬度大小

我想使窗口和列表框寬度根據列表框條目長度(以字符數)動態更改。作爲一個例子,如果我的列表框有幾個條目,最大長度是30個字符,我想讓窗口和列表框的寬度大於一個窗口的長度是20個字符。

這樣做的最好方法是什麼?

回答

0

您使用的是哪種編程平臺?我猜測.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

MFC是託管C++ – 2009-12-11 17:27:42

+0

這改變了一切。我不是C++的人。也許別人可以幫助你。 ;) – Brad 2009-12-11 17:37:59

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 2009-12-11 19:04:19

+2

您可能需要在每個字符串上調用GetTextExtent。對於比例字體,短的字符串可能比較長的字符串更寬。 – 2009-12-11 19:21:32

+0

您需要確保使用列表框的設備上下文,即「m_list.GetWindowDC()」而不是「GetWindowDC()」。此外,要使用列表框的當前字體而不是默認系統字體來測量文本,您還需要「m_list.GetWindowDC()。SelectObject(m_list.GetFont())」。 – ulatekh 2013-10-22 00:17:07

0

試試這個:

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