⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gridctrl.h

📁 EVC的Grid ctrl应用,有需要的朋友可以联系我哦
💻 H
📖 第 1 页 / 共 2 页
字号:

	SItemCol():m_nXSprtPercent(50){
	}
};

struct SHdr:public SRowImpl<SItemCol>,public SGHeader<CGStatic>{
	SHdr(CWnd* pWnd,grid_item& gi):SGHeader<CGStatic>(pWnd,gi){
	}
	virtual void Recalc(){
		
		if(m_pHdr){
			m_rct.bottom=m_rct.top+GITEM_HEIGHT;
			m_pHdr->MoveWindow(&m_rct);

			m_rct.top=m_rct.bottom+=GITEM_Y_SEP;

		}else m_rct.top+=GHDR_Y_SEP;

		_ThisObj::Recalc();
	}
	void Attach(SHdr& rObjFrom){
		ObjItr itrFromHdr(rObjFrom.m_ObjCnt.begin());
		while(itrFromHdr!=rObjFrom.m_ObjCnt.end()){
			m_ObjCnt.push_back(*itrFromHdr);
			itrFromHdr=rObjFrom.m_ObjCnt.erase(itrFromHdr);
		}
	}
};

struct SFind{
	SColImpl<SRowImpl<SHdr> >::ObjItr m_itrHdrRow;
	SRowImpl<SHdr>::ObjItr m_itrHdr;
	SHdr::ObjItr m_itrItemCol;
	SItemCol::ObjItr m_itrItem;

	GI_TYPE m_giType;
	int m_nCurrPos;
};

/////// Item manager //////////////////
template<class TObj>
class CItemMgr{
	CWnd* m_pWnd;
	TObj& m_rObj;
	SFind& m_rFind;

	CFont m_fntGHeader;
	CFont m_fntIHeader;

public:
	bool Insert(grid_item& gi){
		
		if((gi.m_giType==GI_HEADER&&(gi.m_dwStyle&GIL_MASK)==GLS_NR)||!m_rObj.m_ObjCnt.size()){
			m_rFind.m_itrHdrRow=m_rObj.m_ObjCnt.insert(m_rFind.m_itrHdrRow,new SRowImpl<SHdr>());
			m_rFind.m_itrHdr=(*m_rFind.m_itrHdrRow)->m_ObjCnt.end();
		
		}else{
			if(m_rFind.m_itrHdrRow==m_rObj.m_ObjCnt.end())m_rFind.m_itrHdrRow--;
		}
		
		if((gi.m_giType==GI_HEADER&&(gi.m_dwStyle&GIL_MASK)==GLS_NC)||!(*m_rFind.m_itrHdrRow)->m_ObjCnt.size()){
			m_rFind.m_itrHdr=(*m_rFind.m_itrHdrRow)->m_ObjCnt.insert(m_rFind.m_itrHdr,new SHdr(m_pWnd,gi.m_giType==GI_HEADER?gi:gi_hdr(0)));

			(*m_rFind.m_itrHdr)->SetFont(m_fntGHeader);

			m_rFind.m_itrItemCol=(*m_rFind.m_itrHdr)->m_ObjCnt.end();

		}else if(m_rFind.m_itrHdr==(*m_rFind.m_itrHdrRow)->m_ObjCnt.end())m_rFind.m_itrHdr--;
		
		if(gi.m_giType!=GI_HEADER){

			if(m_rFind.m_giType==GI_HEADER)m_rFind.m_itrItemCol=(*m_rFind.m_itrHdr)->m_ObjCnt.end();

			if((gi.m_dwStyle&GIL_MASK)==GLS_NC||!(*m_rFind.m_itrHdr)->m_ObjCnt.size()){
				m_rFind.m_itrItemCol=(*m_rFind.m_itrHdr)->m_ObjCnt.insert(m_rFind.m_itrItemCol,new SItemCol());
				m_rFind.m_itrItem=(*m_rFind.m_itrItemCol)->m_ObjCnt.end();
			
			}else{
				if(m_rFind.m_itrItemCol==(*m_rFind.m_itrHdr)->m_ObjCnt.end())m_rFind.m_itrItemCol--;
				m_rFind.m_itrItem=(*m_rFind.m_itrItemCol)->m_ObjCnt.end();
			}

			m_rFind.m_itrItem=(*m_rFind.m_itrItemCol)->m_ObjCnt.insert(m_rFind.m_itrItem,new SGItem<CGStatic,CGEdit,CAdvComboBox>(m_pWnd,gi,(*m_rFind.m_itrItemCol)->m_nXSprtPixel));
			(*m_rFind.m_itrItem)->SetFont(m_fntIHeader);
		}

		m_rObj.Recalc();

		return true;
	}

	bool Delete(){

		if(m_rFind.m_nCurrPos==-1)return false;

		if(m_rFind.m_giType==GI_HEADER){
			if(m_rFind.m_itrHdr!=(*m_rFind.m_itrHdrRow)->m_ObjCnt.begin())(*(m_rFind.m_itrHdr-1))->Attach(**m_rFind.m_itrHdr);
			else if(m_rFind.m_itrHdrRow!=m_rObj.m_ObjCnt.begin())(*(m_rFind.m_itrHdrRow-1))->m_ObjCnt.back()->Attach(**m_rFind.m_itrHdr);

			delete *m_rFind.m_itrHdr;
			(*m_rFind.m_itrHdrRow)->m_ObjCnt.erase(m_rFind.m_itrHdr);

			if(!(*m_rFind.m_itrHdrRow)->m_ObjCnt.size()){
				delete *m_rFind.m_itrHdrRow;
				m_rObj.m_ObjCnt.erase(m_rFind.m_itrHdrRow);
			}
		}else{
			delete *m_rFind.m_itrItem;
			(*m_rFind.m_itrItemCol)->m_ObjCnt.erase(m_rFind.m_itrItem);

			if(!(*m_rFind.m_itrItemCol)->m_ObjCnt.size()){
				delete *m_rFind.m_itrItemCol;
				(*m_rFind.m_itrHdr)->m_ObjCnt.erase(m_rFind.m_itrItemCol);
			}
		}

		m_rObj.Recalc();
		return true;
	}

	__declspec(property(put=put_Name,get=get_Name))CString Name;
	void put_Name(CString strName){
		if(m_rFind.m_nCurrPos!=-1){
			if(m_rFind.m_giType==GI_HEADER){
				(*m_rFind.m_itrHdr)->SetName(strName);
			}else{
				(*m_rFind.m_itrItem)->SetName(strName);
			}
		}
	}
	CString get_Name(){
		if(m_rFind.m_nCurrPos!=-1){
			if(m_rFind.m_giType==GI_HEADER){
				return (*m_rFind.m_itrHdr)->GetName();
			}else{
				return (*m_rFind.m_itrItem)->GetName();
			}
		}
		return 0;
	}

	__declspec(property(put=put_Text,get=get_Text))CString Text;
	void put_Text(CString strText){
		if(m_rFind.m_nCurrPos!=-1)
			if(m_rFind.m_giType!=GI_HEADER)(*m_rFind.m_itrItem)->SetText(strText);
	}
	CString get_Text(){
		if(m_rFind.m_nCurrPos!=-1)
			if(m_rFind.m_giType!=GI_HEADER)return (*m_rFind.m_itrItem)->GetText();
		return 0;
	}

	__declspec(property(get=get_Type))GI_TYPE Type;
	GI_TYPE get_Type(){
		if(m_rFind.m_nCurrPos==-1)return GI_TYPE(-1);
		return m_rFind.m_giType;
	}

	__declspec(property(put=put_Data,get=get_Data))void* Data;
	void put_Data(void* pvData){
		if(m_rFind.m_nCurrPos!=-1){
			if(m_rFind.m_giType==GI_HEADER){
				(*m_rFind.m_itrHdr)->m_pvData=pvData;
			}else{
				(*m_rFind.m_itrItem)->m_pvData=pvData;
			}
		}
	}
	void* get_Data(){
		if(m_rFind.m_nCurrPos!=-1){
			if(m_rFind.m_giType==GI_HEADER){
				return (*m_rFind.m_itrHdr)->m_pvData;
			}else{
				return (*m_rFind.m_itrItem)->m_pvData;
			}
		}
		return (void*)-1;
	}

	__declspec(property(get=get_SubItem))CSubItemMgr<CAdvComboBox>* SubItem;
	CSubItemMgr<CAdvComboBox>* get_SubItem(){
		if(m_rFind.m_nCurrPos!=-1&&m_rFind.m_giType!=GI_HEADER)return (*m_rFind.m_itrItem)->m_pSubItemMgr;
		return 0;
	}

	__declspec(property(get=get_ID))int ID;
	int get_ID(){
		if(m_rFind.m_nCurrPos!=-1){
			if(m_rFind.m_giType==GI_HEADER)return (*m_rFind.m_itrHdr)->m_dwID;
			else return (*m_rFind.m_itrItem)->m_dwID;
		}
		return -1;
	}
	__declspec(property(get=get_Index))int Index;
	int get_Index(){return m_rFind.m_nCurrPos;}

	__declspec(property(get=get_Style))DWORD Style;
	DWORD get_Style(){
		if(m_rFind.m_nCurrPos!=-1){
			if(m_rFind.m_giType==GI_HEADER)return (*m_rFind.m_itrHdr)->m_dwStyle;
			else return (*m_rFind.m_itrItem)->m_dwStyle;
		}
		return 0;
	}

	__declspec(property(put=put_ReadOnly,get=get_ReadOnly))bool ReadOnly;
	void put_ReadOnly(bool bReadOnly){
		if(m_rFind.m_nCurrPos!=-1&&m_rFind.m_giType!=GI_HEADER)(*m_rFind.m_itrItem)->SetReadOnly(bReadOnly);
	}
	bool get_ReadOnly(){
		if(m_rFind.m_nCurrPos==-1||m_rFind.m_giType==GI_HEADER)return false;

		return (*m_rFind.m_itrItem)->m_dwStyle&GSS_RDNL;
	}
	
	void SetFocus(){
		if(m_rFind.m_nCurrPos!=-1&&m_rFind.m_giType!=GI_HEADER)static_cast<CWnd*>((*m_rFind.m_itrItem)->m_pCtrl)->SetFocus();
	}

	CItemMgr(CWnd* pWnd,TObj& rObj,SFind& rFind):
	m_pWnd(pWnd),m_rObj(rObj),m_rFind(rFind){

		CFont fntTmp;
		fntTmp.CreatePointFont(80,"Tahoma");

		LOGFONT lf;
		fntTmp.GetLogFont(&lf);

		lf.lfHeight-=1;

		m_fntIHeader.CreateFontIndirect(&lf);

		lf.lfWeight=FW_BOLD;

		m_fntGHeader.CreateFontIndirect(&lf);
	}
};

/////// Grid manager //////////////////
template<class TObj>
class CGridMgr{
	friend class CItemMgr<TObj>;

	CItemMgr<TObj> m_ItemMgr;

	CWnd* m_pWnd;
	TObj& m_rObj;
	SFind m_Find;

public:
	CGridMgr(CWnd* pWnd,TObj& rObj):m_pWnd(pWnd),m_rObj(rObj),m_ItemMgr(pWnd,rObj,m_Find){
	}

	__declspec(property(get=get_ID))CItemMgr<TObj>* ID[];
	CItemMgr<TObj>* get_ID(int nID){
		if(!Find(nID,false)&&nID!=-1)return 0;
		return &m_ItemMgr;
	}
	__declspec(property(get=get_Index))CItemMgr<TObj>* Index[];
	CItemMgr<TObj>* get_Index(int nIndex){
		if(!Find(nIndex,true)&&nIndex!=-1)return 0;
		return &m_ItemMgr;
	}
	void DeleteAll(){
		TObj::ObjItr itr(m_rObj.m_ObjCnt.begin());
		
		while(itr!=m_rObj.m_ObjCnt.end())delete *itr++;
		m_rObj.m_ObjCnt.clear();

		m_rObj.Recalc();
	}

	__declspec(property(put=put_ReadOnlyAll))bool ReadOnlyAll;
	void put_ReadOnlyAll(bool bReadOnly){
		const int nCount(Count);
		for(int i=0;i<nCount;i++)Index[i]->ReadOnly=bReadOnly;
	}

	__declspec(property(get=get_Count))DWORD Count;
	DWORD get_Count(){
		m_Find.m_nCurrPos=0;

		m_Find.m_itrHdrRow=m_rObj.m_ObjCnt.begin();
		while(m_Find.m_itrHdrRow!=m_rObj.m_ObjCnt.end()){
			m_Find.m_nCurrPos+=(DWORD)(*m_Find.m_itrHdrRow)->m_ObjCnt.size();

			m_Find.m_itrHdr=(*m_Find.m_itrHdrRow)->m_ObjCnt.begin();
			while(m_Find.m_itrHdr!=(*m_Find.m_itrHdrRow)->m_ObjCnt.end()){

				m_Find.m_itrItemCol=(*m_Find.m_itrHdr)->m_ObjCnt.begin();
				while(m_Find.m_itrItemCol!=(*m_Find.m_itrHdr)->m_ObjCnt.end())m_Find.m_nCurrPos+=(DWORD)(*m_Find.m_itrItemCol++)->m_ObjCnt.size();

				m_Find.m_itrHdr++;
			}
			m_Find.m_itrHdrRow++;
		}
		return m_Find.m_nCurrPos;
	}

protected:

	bool Find(DWORD dwItem,bool bByPos){
		m_Find.m_itrHdrRow=m_rObj.m_ObjCnt.begin();

		m_Find.m_nCurrPos=0;

		while(m_Find.m_itrHdrRow!=m_rObj.m_ObjCnt.end()){
			m_Find.m_itrHdr=(*m_Find.m_itrHdrRow)->m_ObjCnt.begin();

			while(m_Find.m_itrHdr!=(*m_Find.m_itrHdrRow)->m_ObjCnt.end()){
				
				m_Find.m_giType=GI_HEADER;

				if(bByPos){if(m_Find.m_nCurrPos==dwItem)return true;
				}else if((*m_Find.m_itrHdr)->m_dwID==dwItem)return true;

				m_Find.m_nCurrPos++;

				m_Find.m_itrItemCol=(*m_Find.m_itrHdr)->m_ObjCnt.begin();
				while(m_Find.m_itrItemCol!=(*m_Find.m_itrHdr)->m_ObjCnt.end()){
					m_Find.m_itrItem=(*m_Find.m_itrItemCol)->m_ObjCnt.begin();

					while(m_Find.m_itrItem!=(*m_Find.m_itrItemCol)->m_ObjCnt.end()){

						m_Find.m_giType=(*m_Find.m_itrItem)->m_giType;

						if(bByPos){if(m_Find.m_nCurrPos==dwItem)return true;
						}else if((*m_Find.m_itrItem)->m_dwID==dwItem)return true;

						m_Find.m_nCurrPos++;

						m_Find.m_itrItem++;
					}
					m_Find.m_itrItemCol++;					
				}
				m_Find.m_itrHdr++;
			}
			m_Find.m_itrHdrRow++;
		}

		m_Find.m_nCurrPos=-1;
		return false;
	}
};


/////// CGridCtrl /////////////////////
class CGridCtrl:public CWnd,protected SColImpl<SRowImpl<SHdr> >{

	CBrush m_brGHeader;
	CBrush m_brIHeader;

	typedef class CGridMgr<_ThisObj> _GridMgr;
	friend class _GridMgr;

	DWORD m_dwStyle;
	_GridMgr* m_pGridMgr;

	virtual void Recalc();

public:
	CGridCtrl();
	virtual ~CGridCtrl();

	bool Create(DWORD dwStyle,RECT& rct,CWnd* pParent,UINT nID=-1);

	_GridMgr* operator->(){return m_pGridMgr;}

	CGridCtrl& operator<<(grid_item& gi){

		ASSERT(m_pGridMgr);

		m_pGridMgr->Index[-1]->Insert(gi);
		return *this;
	}

protected:
	DECLARE_MESSAGE_MAP()
	virtual void PreSubclassWindow();

	SItemCol* m_pHitCol;
	bool m_bMoveSprt;

public:
	afx_msg void OnDestroy();
	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -