
#if !defined(AFX_CLISTBOXEBX_) 
#define AFX_CLISTBOXEBX_ 
 
#if _MSC_VER >= 1000 
#pragma once 
#endif // _MSC_VER >= 1000 
 
//-------------------------------------------------------------------------- 
//	Copyright 2001 (C) Enver Buzoku, ebuzoku@hotmail.com 
// 
//	This class extends CListBox. 
//	Idea was taken from the CColorListBox class, found at www.codeguru.com, 
//	designed and updated by Patrice Godard and Paul M. Meidinger. 
// 
//	CListBoxEBX features. 
//		Background colour. 
//		Foreground colour. 
//		Text horizontal alignment. 
//		Text vertical alignment. 
//		Indicating inactive items. 
//		Hooking of a DWORD value per item as in original SetItemData. 
//		Allows for setting of the item height 
// 
//	Desired features. 
//		Font manipulation. 
//		Use of images 
//		Horisontal scrolling. 
// 
//	Points to note: 
//	---------------- 
//	Default index is set to (-1) for all set functions this means that the 
//	operation will apply to the currently selected item. 
// 
//	DEF_COL - definition is used to indicate that the item is using windows 
//  colours. 
// 
//	Required style flags, that must be set, are: 'Owner Draw' and 'Has Strings' 
//-------------------------------------------------------------------------- 
 
///////////////////////////////////////////////////////////////////////////// 
// CListBoxEBX window 
 
#define DEF_COL 17000000 
 
class CListBoxEBX : public CListBox 
{ 
protected: 
	struct LItem 
	{ 
		COLORREF	cBg,	cFg; 
		UINT		uHal,	uVal; 
		BOOL		bActive; 
		DWORD		dw; 
		DWORD_PTR	id;
	}; 
 
	CListBox*	m_pSuper; 
	int			m_iItemHeight; 
 
	int		Ix(int ix); 
	LItem*	Item(int ix); 
 
	static bool AlphaBlendU(HDC dcDest, int x, int y, int cx, int cy, 
		HDC dcSrc, int sx, int sy, int scx, int scy, int alpha); 
 
public: 
	CListBoxEBX(); 
	virtual ~CListBoxEBX(); 
 
 
	// Adds an item to the end of the list 
	int AddItem 
		( 
			LPCTSTR lpszItem, 
			COLORREF bg=DEF_COL,	  COLORREF fg=DEF_COL, 
			DWORD_PTR	id=0,
			UINT hal=DT_LEFT, UINT val=DT_VCENTER, 
			BOOL active=TRUE, DWORD res=NULL 
		); 
 
 
	// Adds an item at specified index. 
	int InsertItem 
		( 
			LPCTSTR lpszItem, int ix, 
			COLORREF bg=DEF_COL,	  COLORREF fg=DEF_COL, 
			DWORD_PTR	id=0,
			UINT hal=DT_LEFT, UINT val=DT_VCENTER, 
			BOOL active=TRUE, DWORD res=NULL 
		);
	DWORD_PTR GetItemData1(int Item);
 
	// Removes an item 
	BOOL RemoveAt(int ix); 
 
	// Removes all items 
	void ResetContent(); 
 
	// 
	BOOL SetBg(COLORREF color,	int ix = -1);	// item background 0 - 16777215 
	BOOL SetFg(COLORREF color,	int ix = -1);	// item foreground 0 - 16777215 
	BOOL SetVal(UINT align,		int ix = -1);	// DT_TOP, DT_VCENTER, DT_BOTTOM 
	BOOL SetHal(UINT align,		int ix = -1);	// DT_LEFT, DT_CENTER, DT_RIGHT 
	BOOL SetActive(BOOL bActive,		int ix = -1);	// TRUE/FALSE 
	BOOL SetData(DWORD data,	int ix = -1);	// DWORD ? 
 
 
	COLORREF GetBg(int ix = -1)		{ return Item(ix)->cBg;		} 
	COLORREF GetFg(int ix = -1)		{ return Item(ix)->cFg;		} 
	UINT	 GetVal(int ix = -1)	{ return Item(ix)->uVal;	} 
	UINT	 GetHal(int ix = -1)	{ return Item(ix)->uHal;	} 
	BOOL	 GetActive(int ix = -1) { return Item(ix)->bActive;	} 
	DWORD	 GetData(int ix = -1)	{ return Item(ix)->dw;		} 
 
	// call this to set item height, it should be called before items are added. 
	int SetItemHeight(int h) 
	{ 
		int oldH = m_iItemHeight; 
		m_iItemHeight = h; 
 
		return oldH; 
	} 
 
// Overrides 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CListBoxEBX) 
	public: 
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); 
	virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct); 
	//}}AFX_VIRTUAL 
 
 
	// Generated message map functions 
protected: 
	//{{AFX_MSG(CListBoxEBX) 
	afx_msg void OnDestroy(); 
	afx_msg void OnSysColorChange(); 
	//}}AFX_MSG 
 
	DECLARE_MESSAGE_MAP() 
}; 
 
///////////////////////////////////////////////////////////////////////////// 
 
//{{AFX_INSERT_LOCATION}} 
// Microsoft Developer Studio will insert additional declarations immediately before the previous line. 
 
#endif 
