#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 항목 추가.
[출처] CListCtrl 글자 크기 바꾸기. 색 변경하기..|작성자 소심쟁이
'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 |