CListCtrl控件重绘源码---持续更新



下载源码请到以下地址:http://download.csdn.net/detail/dongdan_002/8252897




代码功能见头文件:

#include "MyHeadCtrl.h"	// Added by ClassView
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MyListCtrl1.h : header file
//
/*********************************************
* CExArray扩展类:功能类似于CArray
* 用处:管理CELLVALUE结构指针
* 功能:添加、删除、获取结构(CELLVALUE)指针
**********************************************/
template<class T>
class CExArray
{
public:
	CExArray(int nSize=10){m_dwSize=10;m_dwCurCount=0;m_pVal=NULL;m_pVal=new T[nSize];};
	virtual ~CExArray(){if(m_pVal!=NULL){delete[] m_pVal;m_pVal=NULL;}};
	//
public:
	void Add(T& cell);
	BOOL GetAt(DWORD dwRow,DWORD dwCol,T& cell);
	BOOL GetAt(DWORD dwIndex,T& cell);
	T* GetAt(DWORD dwRow,DWORD dwCol);
	T* GetAt(DWORD dwIndex);
	void DelAt(DWORD dwRow,DWORD dwCOl);
	void DelAll(void);
	int  GetCount(void);
private:
	T *m_pVal;
	DWORD m_dwSize;
	DWORD m_dwCurCount;
};

/***************************************************************************************
* 类名称:	CMyListCtrl :public CListCtrl
* 类说明:	CMyListCtrl类是继承自CListCtrl类,对CListCtrl类进行重绘和扩长新功能
* 功能:	可以设置列表的行高大小  
*			可以设置列表头的行高大小
*			可以设置单元格的文本颜色、背景颜色、字体
*			可以设置列头每一列的文本颜色、背景颜色、字体
*			可以通过鼠标双击某个单元格显示控件(CEdit、CComboBox)对该单元格中内容修改
*			可以再单元格中显示位图资源
***************************************************************************************/
class CMyListCtrl : public CListCtrl
{
// Construction
public:
	CMyListCtrl();

// Attributes
public:
// Operations
public:
	//0-char,1-int,2-float,3-char* ; 0-IDC_EDIT,1-IDC_CMB,注意:pData,pComboStr只是存储他的指针!
	void Attach(DWORD dwItem,DWORD dwSubItem,void* pData,unsigned char cDataType=0,unsigned char cCtrlType=0,\
		 int nComboStr=0,CString* pComboStr=NULL);

	//设置某一个单元格中最大可写的字符串
	void SetStrMaxLen(int nRow,int nCol,int nMaxLen=256);

	//获取ItemValue Change的Num
	int GetItemChangeNum(void);

	//在调用GetNextItemChange之前先调用这个函数一次既可以了
	bool GetFirstItemChange(int& row,int& col);

	//获取ItemValue Change的行号和列号
	bool GetNextItemChange(int& row,int& col);
	/
	// 设置表头高度
	void SetHeadHeight(float Height);

	// Gradient - 渐变系数,立体背景用,不用渐变设为0
	void SetHeadBKColor(COLORREF rgb,int Gradient,int col=-1);
	/

	//设置行颜色
	void SetRowColor(int row,COLORREF color);

	//取消设置的行颜色
	void UnSetRowColor(int row);

	//设置列颜色
	void SetColColor(int col,COLORREF color); 

	//设置单元格颜色
	void SetItemColor(int row,int col,COLORREF color);

	//设置行文本颜色
	void SetRowTextColor(int row,COLORREF color);

	//取消设置的行文本颜色
	void UnSetRowTextColor(int row);

	//设置列文本颜色
	void SetColTextColor(int col,COLORREF color);

	//设置单元格文本颜色
	void SetItemTextColor(int row,int col,COLORREF color);

	//设置行高
	void SetRowHeigt(int nHeight);

	//设置头部字体
	void SetHeadFont(int nSize,BOOL bBold,BOOL bItalic,BOOL bUnderLine,LPCTSTR pszName="宋体");

	//设置头部字体颜色
	void SetHeadTextColor(COLORREF color,int col=-1);

	//
	//设置整个列表的字体
	void SetFont(int nSize,BOOL bBold,BOOL bItalic,BOOL bUnderLine,LPCTSTR pszName="宋体");

	//设置一列的字体
	void SetColFont(int col,int nSize,BOOL bBold,BOOL bItalic,BOOL bUnderLine,LPCTSTR pszName="宋体");

	//设置某一个单元格中的字体
	void SetItemFont(int row,int col,int nSize,BOOL bBold,BOOL bItalic,BOOL bUnderLine,LPCTSTR pszName="宋体");

	//设置列头某一列的字体
	void SetHeadColFont(int col,int nFontSize,BOOL Bold,BOOL Italic,BOOL UnderLine,LPCTSTR pszFontName="宋体");

	///

	//查找某一列背景颜色
	int FindColColor(int col ,COLORREF &color);

	//查找某一行背景颜色
	int FindRowColor(int row ,COLORREF &color);

	//查找某一个单元格背景颜色
	int FindItemColor(int col,int row,COLORREF &color);

	//查找某一行文本颜色
	int FindRowTextColor(int row,COLORREF &color);

	//查找某一列文本颜色
	int FindColTextColor(int col,COLORREF &color);

	//查找某一单元格文本颜色
	int FindItemTextColor(int col,int row,COLORREF &color);

	//查找某一列的字体
	int FindColFont(int col);

	//查找某一个单元格的字体
	int FindItemFont(int row,int col);
// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CMyListCtrl)
	protected:
	virtual void PreSubclassWindow();
	//}}AFX_VIRTUAL

// Implementation
public:
	//插入一行,第一列写入Int值
	int	 InsertItemInt(int nItem,int val);

	//在指定单元格写入Int值
	BOOL SetItemInt(int nItem,int nSubItem,int val);

	//在指定单元格写入Float值
	BOOL SetItemFloat(int nItem,int nSubItem,float val);

	//获取指定单元格的值转化为Int类型
	int	 GetItemInt(int nItem,int nSubItem);
	
	//获取指定单元格的值转化为Float类型
	float GetItemFloat(int nItem,int nSubItem);
	//
	//清空列表
	void Clear(void);

	//清空列表头
	void ClearHead(void);

	//设置回调函数(KillComboBox的回调)
	void SetCallbackFunc(COMBOKILLFOCUS pFunc,CDialog* pDlg=NULL);

	// 单元格左键双击事件
	void SetItemDblClkFunc(ITEMDBLCLK pFunc,int nColItem,void* pParam);

	//获取当前选中的行
	int GetCurSel(void);

	//获取上一次选中的行
	int GetPrevSel(void);

	//设置当前选中的行
	void SetCurSel(int nItem);

	//设置选中一列的模式
	void SetColSelectMode(bool bColSelect=TRUE);

	//设置选中一行的模式
	void SetLineSelectMode(bool bLineSelect=TRUE,bool bLineSelectBkColor=TRUE);

	//COMBOBOX控件Value Change 时用于更新
	void UpdateCombo(int nCol,CString* pComboStr,int nComboStr);

	//设置单元中图片
	void SetItemImage(int row,int col,UINT nIDResource);

	//取消单元中的图片
	void UnSetItemImage(int row,int col);

	//判断单元格中是否有图片
	BOOL IsItemImage(int row,int col);

	//更新单元格中的文本串
	void Update(int row,int col,LPCTSTR pszTxt);

	//获取单元格的Rect
	void GetCellRect(int nItem,int nSubItem,CRect& rect);

	//插入一列(Format=DT_LEFT、DT_CENTER、DT_RIGHT)
	int InsertColumn(int col,LPCTSTR pszHead,UINT Format,int nHeadWidth);

	//插入所有列
	void InsertColumn(int num,CString* pHead,UINT Format,int* pHeadWidth);

	//响应的消息
	virtual ~CMyListCtrl();
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
	afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);
	void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
	//私有函数
private:
	void UpdateCharData(CELLVALUE* pcv,CString& strItem);
	void UpdateUCharData(CELLVALUE* pcv,CString& strItem);
	void UpdateStringData(CELLVALUE* pcv,CString& strItem);
	void UpdateIntData(CELLVALUE* pcv,CString& strItem);
	void UpdateLongData(CELLVALUE* pcv,CString& strItem);
	void UpdateFloatData(CELLVALUE* pcv,CString& strItem);
	void UpdateDoubleData(CELLVALUE* pcv,CString& strItem);
	// Generated message map functions
	//afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
protected:
	//{{AFX_MSG(CMyListCtrl)
	afx_msg void OnSetfocusEdit();
	afx_msg void OnKillfocusEdit();
	afx_msg void OnSetfocusCombo();
	afx_msg void OnKillfocusCombo();
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
	afx_msg void OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult);
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()

	//类的私有成员变量
private:
	int m_nCurSelCol;//当前选中的列
	int m_nPrevSelected;//上一次选中的行
	int m_nCurSelected;//当前选中的行
	bool m_bLineSelected;
	bool m_bLineSelectedMode;//一行选中模式
	int m_nColSelected;
	bool m_bColSelectedMode;//一列选中模式
	bool m_bLineSelectBkColor;//行选中模式时,选中一行是否需要背景色
	//Private Function
	BOOL CreateCtrl(CELLVALUE* pCV);
	///
	CMyHeadCtrl m_Head;
	CFont *m_pFont;
	///
	//控件
	CEdit* m_pEdit;
	CComboBox* m_pCombo;
	

	
	stFont* m_pItemFont;	//保存Item字体
	int m_nFont,m_nFontSize;
	
	CExArray<CELLVALUE> m_val;
//	CExArray<CELLSTYLE> m_stl;
	CFont *m_pCmbFont;
	/
	CArray<stColor,stColor&> m_ptrListRow;		//保存行颜色
	CArray<stColor,stColor&> m_ptrListCol;		//保存列颜色
	CArray<stColor,stColor&> m_ptrListItem;		//保存Item颜色表
	CArray<stColor,stColor&> m_colTextColor;	//保存列字体颜色
	CArray<stColor,stColor&> m_rowTextColor;	//保存行字体颜色
	CArray<stColor,stColor&> m_ItemTextColor;	//保存单元格字体颜色
	/
	CELLVALUE* m_pCV;
	int m_nRowHeight;//行高!
	///
	//CALLBACK FUNCTION
	COMBOKILLFOCUS m_pComboKillFocus;
	ITEMDBLCLK m_pItemDblClk;
	//CALLBACK FUNCTION PARAMS COMBOKILLFOCUS
	CDialog* m_pDlg;
	//CALLBACK FUNCTION PARAMS ITEMDLBCLK
	int m_nColItem;
	void* m_pVoid; // 返回的参数
	/
	//用于GetNextItemChange(int& row,int& col)函数
	int m_nCurItemChange;
	
};

/


//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MYLISTCTRL1_H__6F14775C_CA2F_464E_84E6_D400E924309E__INCLUDED_)
</pre><pre name="code" class="cpp">


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值