📄 gridctrl.h
字号:
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 + -