www.pudn.com > PhoneReaderSrc.rar > XListBox.cpp


#include "stdafx.h" 
#include "XListBox.h" 
 
int CXListBox::AddItem(LPCTSTR lpszItem, COLORREF rgb) 
{ 
	int nItem = AddString(lpszItem); 
	if (nItem >= 0) 
		SetItemData(nItem, rgb); 
	return nItem; 
} 
 
int CXListBox::InsertItem(int nIndex, LPCTSTR lpszItem, COLORREF rgb) 
{ 
	int nItem = ((CListBox*)this)->InsertString(nIndex,lpszItem); 
	if (nItem >= 0) 
		SetItemData(nItem, rgb); 
	return nItem; 
} 
LRESULT CXListBox::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
{ 
	CClientDC dc(m_hWnd);   //DON'T USE CPAINTDC 
	int nIndex = GetCurSel(); 
	if(nIndex == LB_ERR) 
		return (DWORD)-1; 
	 
	CRect rcItem,rcWnd; 
	GetItemRect(nIndex,&rcItem); 
	GetClientRect(&rcWnd); 
	 
	CDC dcMem; 
	dcMem.CreateCompatibleDC(dc); 
	CBitmap bmpMem; 
	bmpMem.CreateCompatibleBitmap(dc,rcWnd.Width(),rcWnd.Height()); 
	dcMem.SelectBitmap(bmpMem); 
	 
	//Draw border when getting focus  
	DWORD dwStyle = GetStyle(); 
	if(!(dwStyle & WS_BORDER)) 
		rcWnd.right ++; 
	dcMem.SetBkMode(TRANSPARENT); 
	int dcSave = dcMem.SaveDC(); 
	if(m_hWnd == ::GetFocus()) 
		dcMem.SelectStockPen(BLACK_PEN); 
	else 
		dcMem.SelectStockPen(NULL_PEN); 
	dcMem.Rectangle(rcWnd); 
	dcMem.RestoreDC(dcSave); 
 
	//get text 
	CString szText; 
	GetText(nIndex,szText); 
	 
	//Draw focus background 
	COLORREF cfItem = (COLORREF)GetItemData(nIndex); 
	CBrush br; 
	br.CreateSolidBrush(cfItem); 
	CRect rect(rcItem); 
	CSize size; 
	dc.GetTextExtent(szText,szText.GetLength(),&size); 
//	rect.right = rect.right * 9 / 10; 
	rect.DeflateRect(2,2,2,2); 
	dcMem.FillRect(rect,br); 
 
	//draw focus rect of control 
	if(m_bEnableBorder) 
	{ 
		dcMem.DrawFocusRect(&rect); 
		rect.InflateRect(1,1,1,1); 
		CPen Pen; 
		Pen.CreatePen(PS_SOLID,1,RGB(0,128,128)); 
		HPEN hpen = dcMem.SelectPen(Pen.m_hPen); 
		HBRUSH hBrush = dcMem.SelectStockBrush(NULL_BRUSH); 
		dcMem.Rectangle(&rect); 
		dcMem.SelectBrush(hBrush); 
		Pen.DeleteObject(); 
		dcMem.SelectPen(hpen); 
		rect.left += 2; 
	} 
	 
	//Set text color ,text font and Draw text 
	COLORREF crText = dcMem.SetTextColor(cfItem^RGB(255,255,255));  
	if ((cfItem == RGB(128,128,128)) || (cfItem == RGB(128,128,0))) 
		dcMem.SetTextColor(RGB(255,255,255));  
 
	dcMem.DrawText(szText, -1, &rect, DT_SINGLELINE|DT_LEFT|DT_VCENTER); 
	dcMem.SetTextColor(crText); 
	 
	dc.BitBlt(rcWnd.left,rcWnd.top,rcWnd.Width(),rcWnd.Height(),dcMem,0,0,SRCCOPY); 
	dcMem.DeleteDC(); 
	bmpMem.DeleteObject(); 
	return 0; 
} 
 
void CXListBox::EnableRGBBorder(BOOL nEnabled) 
{ 
	m_bEnableBorder = nEnabled; 
//	Invalidate(); 
}