下载源码请到以下地址: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">