본문 바로가기

Development

[CListCtrl] MeasureItem

#define OFFSET_FIRST 2
#define OFFSET_OTHER 6

 

void CReportCtrl::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct )
{

// 글자폰트 변경.
 LOGFONT lf;
 GetFont()->GetLogFont( &lf );

 if( lf.lfHeight < 0 )
  lpMeasureItemStruct->itemHeight = -lf.lfHeight;
 else
  lpMeasureItemStruct->itemHeight = lf.lfHeight;

 if(lpMeasureItemStruct->itemHeight > 0)
  lpMeasureItemStruct->itemHeight += 10;
}

 

 

void CReportCtrl::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
 int nItem=lpDIS->itemID;

 CDC* pDC=CDC::FromHandle(lpDIS->hDC);
  
 CRect rcAllLabels;
 GetItemRect(nItem,rcAllLabels,LVIR_BOUNDS);

 CRect rcItem;
 GetItemRect(nItem,rcItem,LVIR_LABEL);

 rcAllLabels.left=rcItem.left;
// if(rcAllLabels.right<m_cx)
//  rcAllLabels.right=m_cx-2;

 LV_ITEM lvi;
 lvi.mask=LVIF_STATE;
 lvi.iItem=nItem;
 lvi.iSubItem=0;
 lvi.stateMask=0xFFFF;  
 GetItem(&lvi);

 BOOL bFocus=(GetFocus()==this);
 BOOL bSelected=(lvi.state&LVIS_SELECTED);      
 
 int nOldDCMode=pDC->SaveDC();

 COLORREF textcolor = ::GetSysColor(COLOR_WINDOWTEXT);
 
 pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));
 pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
 pDC->FillRect(rcAllLabels,&CBrush(::GetSysColor(COLOR_WINDOW)));
 
 UINT nJustify=DT_LEFT;
 UINT nFormat=DT_SINGLELINE|DT_NOPREFIX|DT_VCENTER;

 CString sText;
 sText=MakeShortString(pDC, GetItemText(nItem,0),rcItem.Width());
 pDC->DrawText(sText,-1,&rcItem,nFormat|nJustify);

 rcItem.left+=OFFSET_FIRST;
 rcItem.right-=OFFSET_FIRST;

 LV_COLUMN lvc;
 lvc.mask=LVCF_FMT|LVCF_WIDTH;

 for(int nCol=1; GetColumn(nCol,&lvc); nCol++)
 {
  if(nCol == INCOME_COL)   textcolor = RGB(255, 0, 0);
  else if(nCol == OUTCOME_COL) textcolor = RGB(0, 0, 255);
  else       textcolor = RGB(0, 0, 0);
  
  pDC->SetTextColor(textcolor);

 

  // 글자 정렬
  if(nCol == INCOME_COL || nCol == OUTCOME_COL) nJustify=DT_RIGHT;
  else           nJustify=DT_LEFT;
  

  rcItem.left=rcItem.right;
  rcItem.right+=lvc.cx;

  rcItem.left+=OFFSET_OTHER;
  rcItem.right-=OFFSET_OTHER;

  sText=MakeShortString(pDC, GetItemText(nItem,nCol),rcItem.Width());
  pDC->DrawText(sText,-1,&rcItem,nFormat|nJustify);

  rcItem.right+=OFFSET_OTHER;
 }
 
// if(lvi.state&LVIS_FOCUSED && bFocus)
//  pDC->DrawFocusRect(rcAllLabels);

 pDC->RestoreDC(nOldDCMode); 
}

LPCTSTR CReportCtrl::MakeShortString(CDC* pDC, LPCTSTR lpszLong, int nColumnLen)
{
 static _TCHAR szLVStaticTemp[1024];

 static const _TCHAR szThreeDots[]=_T("...");

 int nStringLen=lstrlen(lpszLong);

 if(nStringLen==0 || pDC->GetTextExtent(lpszLong,nStringLen).cx<=nColumnLen)
  return(lpszLong);

 lstrcpy(szLVStaticTemp,lpszLong);
 int nAddLen=pDC->GetTextExtent(szThreeDots,sizeof(szThreeDots)).cx;

 for(int i=nStringLen-1; i>0; i--)
 {
  szLVStaticTemp[i]=0;
  if(pDC->GetTextExtent(szLVStaticTemp,i).cx+nAddLen<=nColumnLen)
   break;
 }

 lstrcat(szLVStaticTemp,szThreeDots);

 return(szLVStaticTemp);
}

 

// 숫자에 콤마 넣어주기.

LPCTSTR CReportCtrl::MaskNumber(LPCTSTR lpszNumber)
{
 if(lstrlen(lpszNumber) <= 0)
  return _T("");

 CString strNumber = lpszNumber;
 strNumber.Replace(",", "");

 char szNumber[256], szMask[256];
 memset(&szMask, 0x00, sizeof(szMask));
 memset(&szNumber, 0x00, sizeof(szNumber)); 
 memcpy(&szNumber, strNumber, strNumber.GetLength());
 
 int nMod = strNumber.GetLength() % 3;
 for(int i = 0; i < nMod; i++)
  szMask[i] = szNumber[i];
 
 int j = 0;
 for(i = nMod, j = nMod; i < strNumber.GetLength(); i++, j++)
 {
  if(!szNumber[i])
   break;

  if( (i > 0) && ((i-nMod) % 3 == 0))
  {
   szMask[j] = 44;       // ascii : , = 44
   j++;
  }
  
  szMask[j] = szNumber[i];
 } 

 static _TCHAR szLVStaticTemp[256];
 memset(&szLVStaticTemp, 0x00, 256);
 lstrcat(szLVStaticTemp,szMask);

 return(szLVStaticTemp);
}


LRESULT CReportCtrl::OnSetFont(WPARAM wParam, LPARAM)
{
 LRESULT res =  Default();

 CRect rc;
 GetWindowRect( &rc );

 WINDOWPOS wp;
 wp.hwnd = m_hWnd;
 wp.cx = rc.Width();
 wp.cy = rc.Height();
 wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
 SendMessage( WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp );

 return res;
}

==========================================

virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);

 afx_msg void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct );


 afx_msg LRESULT OnSetFont(WPARAM wParam, LPARAM); 

          - 이거정의 안하면    ON_WM_MEASUREITEM_REFLECT 이벤트 안들어옴.

 

그리고 list 속성에 LVS_OWNERDRAWFIXED 항목 추가.


'Development' 카테고리의 다른 글

[Development] GPL 라이센스를 찾아보다가..  (0) 2009.02.06
[Win32API] RegisterWindowMessage  (0) 2009.01.14
[Utility] 유용한 유틸리티  (2) 2009.01.13
[TRACE] C++ Debug를 위한 TRACE 찍기  (1) 2009.01.13
[Lex&Yacc] 정보  (0) 2009.01.08