2013-05-28 4 views
2

Je suis en train:Comment ajuster la largeur d'une colonne à la largeur de la chaîne la plus longue dans CListCtrl?

tstring subItemText; 
    CDC* pDc = GetListCtrl().GetDC(); 
    for (int row = GetItemCount() - 1; row >= 0; --row) 
    { 
     subItemText = _T(""); 
     for (int col = 0; col < NumCol; ++col) 
     { 
     subItemText = this->GetSubItemString(GetItemData(row), col); 
     CSize sz; 
     // get length of the string in logical units, by default 1 unit == 1 pixel, type of font is accounted 
     sz = pDc->GetOutputTextExtent(subItemText.c_str()); 
     if (static_cast<int>(sz.cx) > ColWidth[col]) 
      ColWidth[col] = sz.cx; 
     } 
    } 
    GetListCtrl().ReleaseDC (pDc); 
    for (int col = 0; col < NumCol; ++col) 
    { 
     SetColumnWidth(col, ColWidth[col]); 
    } 

Comme la largeur de résultat de la colonne est le 20/30% plus grand que l'une des plus grandes chaînes dans cette colonne. Je veux que la largeur de la colonne soit égale à la largeur de la chaîne avec la longueur maximale.

Merci d'avance!

Répondre

3

Ceci est probablement dû au fait que vous n'avez pas sélectionné la police correcte dans le contexte du périphérique. Essayez ceci:

tstring subItemText; 
    CDC* pDc = GetListCtrl().GetDC(); 

    CFont *normalfont = GetListCtrl().GetFont() ; 
    CFont *oldfont = pDc->SelectObject(normalfont) ; 

    for (int row = GetItemCount() - 1; row >= 0; --row) 
    { 
     subItemText = _T(""); 
     for (int col = 0; col < NumCol; ++col) 
     { 
     subItemText = this->GetSubItemString(GetItemData(row), col); 
     CSize sz; 
     // get length of the string in logical units, by default 1 unit == 1 pixel, type of font is accounted 
     sz = pDc->GetOutputTextExtent(subItemText.c_str()); 
     if (static_cast<int>(sz.cx) > ColWidth[col]) 
      ColWidth[col] = sz.cx; 
     } 
    } 

    pDc->SelectObject(oldfont) ; 

    GetListCtrl().ReleaseDC (pDc); 
    for (int col = 0; col < NumCol; ++col) 
    { 
     SetColumnWidth(col, ColWidth[col]); 
    } 
+0

maintenant la largeur de la colonne est plus petite que nécessaire. –

+0

Le propriétaire de votre contrôle de liste est-il dessiné? –

+0

oui, l'élément Draw est implémenté –

2

Je pense que tout ce que vous avez besoin est ceci:

SetColumnWidth(col, LVSCW_AUTOSIZE); 

Dans mes projets, je tire ma propre classe de CListCtrl et utilisez la fonction suivante

void CMyListCtrl::AutoSizeColumnWidths() 
{ 
    // size column widths to content 
    int nNumColumns = GetHeaderCtrl()->GetItemCount(); 

    // for all columns ... 
    for (int i = 0; i < nColumnCount; i++) 
    { 
     // find max of content vs header 
     SetColumnWidth(i, LVSCW_AUTOSIZE); 
     int nColumnWidth = GetColumnWidth(i); 
     SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER); 
     int nHeaderWidth = GetColumnWidth(i); 

     // set width to max 
     SetColumnWidth(i, max(nColumnWidth, nHeaderWidth)); 
    } 
    SetRedraw(TRUE); 
} 

Cela fait en sorte que des colonnes sans contenu toujours obtenir la taille en fonction du texte de l'en-tête.

+0

non Je l'ai essayé avant de poster ma question ici, cela n'a pas résolu mon problème. –

+0

@spin_eight - vraiment? C'est étrange - ça marche bien pour moi - j'ai édité ma réponse pour montrer le code que j'utilise. –

+0

Je sais comment l'utiliser, mais merci pour le code. Je travaille avec un cours de troisième partie, où vous n'avez pas de solution. –

Questions connexes