2013-05-28 7 views
2

나는 노력하고 있어요 : 컬럼의 결과 폭이 해당 열에서 가장 큰 문자열 중 하나 20/30 % 더 큰에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]); 
    } 

으로. 열의 너비가 최대 길이 인 string의 너비와 같아야합니다.

미리 감사드립니다.

답변

3

이것은 장치 컨텍스트에 올바른 글꼴을 선택하지 않았기 때문일 수 있습니다. 이것을 시도하십시오 :

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

이제 열의 너비가 필요한 것보다 작습니다. –

+0

목록 컨트롤 소유자가 그려져 있습니까? –

+0

예, 항목 그리기 구현 –

2

나는 당신이 필요로하는 모든이 생각 : 내 프로젝트에서

SetColumnWidth(col, LVSCW_AUTOSIZE); 

, 나는 CListCtrl에서 내 자신의 클래스를 파생 다음과 같은 기능을 사용

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); 
} 

이 확실하게 그 내용이없는 열 헤더 텍스트에 따라 크기가 조정됩니다.

+0

아니요 여기에 내 질문을 게시하기 전에 시도했지만, 이건 내 문제를 해결하지 못했습니다. –

+0

@spin_eight - 정말요? 그것은 이상한 일입니다. 그것은 저에게 잘 돌아갑니다. 제가 사용하는 코드를 보여주기 위해 제 대답을 편집했습니다. –

+0

코드 사용에 감사하지만 사용 방법을 알고 있습니다. 나는 3 번째 파티 클래스에서 일하는데, 여기서 당신은 해결책이 적용되지 않습니다. –