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

📄 gridctrl.cpp

📁 EVC的Grid ctrl应用,有需要的朋友可以联系我哦
💻 CPP
字号:
#include "stdafx.h"
#include "GridCtrl.h"
#include ".\gridctrl.h"

//////////////////////////// Grid edit /////////////////////////
IMPLEMENT_DYNAMIC(CGEdit, CEdit)
CGEdit::CGEdit(){
}

CGEdit::~CGEdit(){
}

BEGIN_MESSAGE_MAP(CGEdit, CEdit)
	ON_WM_ENABLE()
	ON_WM_NCPAINT()
	ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

void CGEdit::OnEnable(BOOL bEnable){
	SetReadOnly(!bEnable);
}

BOOL CGEdit::PreCreateWindow(CREATESTRUCT& cs){
	cs.dwExStyle=WS_EX_STATICEDGE;
	
	if(cs.style&ES_READONLY)m_bkBrush.CreateSolidBrush(G_EDIT_RDNL_CLR);
	else m_bkBrush.CreateSolidBrush(0xffffff);

	return CEdit::PreCreateWindow(cs);
}
void CGEdit::OnNcPaint(){
	CWindowDC dc(this);

	CRect rctClient;
	GetClientRect(&rctClient);

	CRect rctWnd;
	GetWindowRect(&rctWnd);

	ClientToScreen(&rctClient);
	rctClient.OffsetRect(-rctWnd.TopLeft());
	rctWnd.OffsetRect(-rctWnd.TopLeft());

	dc.ExcludeClipRect(&rctClient);

	if(GetStyle()&ES_READONLY)dc.Draw3dRect(rctWnd,G_EDIT_RDNL_CLR,G_EDIT_RDNL_CLR);
	else dc.Draw3dRect(rctWnd,0xffffff,0xffffff);
}
HBRUSH CGEdit::CtlColor(CDC* pDC, UINT nCtlColor){
	pDC->SetBkMode(TRANSPARENT);
	return m_bkBrush;
}
BOOL CGEdit::SetReadOnly(bool bReadOnly){
	m_bkBrush.DeleteObject();

	if(bReadOnly)m_bkBrush.CreateSolidBrush(G_EDIT_RDNL_CLR);
	else m_bkBrush.CreateSolidBrush(0xffffff);

	return CEdit::SetReadOnly(bReadOnly);
}

//////////////////////// Grid static ////////////////////////////
IMPLEMENT_DYNAMIC(CGStatic, CStatic)
CGStatic::CGStatic(){
}

CGStatic::~CGStatic(){
}

BEGIN_MESSAGE_MAP(CGStatic, CStatic)
END_MESSAGE_MAP()

LRESULT CGStatic::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){
	/*switch(message){
		case WM_PAINT:
			{
				CPaintDC dcPaint(this);

				RECT rct;
				GetClientRect(&rct);

				CDC MemDC;
				MemDC.CreateCompatibleDC(&dcPaint);

				CBitmap bmp;
				bmp.CreateCompatibleBitmap(&dcPaint,rct.right,rct.bottom);

				MemDC.SelectObject(&bmp);

				CWnd* pWnd(GetWindow(GW_CHILD));

				while(pWnd){
					CRect rctChild;
					pWnd->GetWindowRect(&rctChild);

					ScreenToClient(&rctChild);
					dcPaint.ExcludeClipRect(&rctChild);

					pWnd=GetWindow(GW_HWNDNEXT);
				}
				
				DefWindowProc(WM_PAINT,(WPARAM)MemDC.m_hDC,0);

				MemDC.DrawFrameControl(CRect(100,0,130,16),DFC_SCROLL,DFCS_SCROLLDOWN);

				dcPaint.BitBlt(0,0,rct.right,rct.bottom,&MemDC,0,0,SRCCOPY);
			}
			return true;
	}*/
	return CStatic::WindowProc(message, wParam, lParam);
}

///////////////////////////////////////////////////
#define GRID_CTRL_CLASS	"GridCtrl"

CGridCtrl::CGridCtrl():m_pGridMgr(0),m_bMoveSprt(false){
	HINSTANCE hInst(AfxGetInstanceHandle());
	WNDCLASSEX wndClassEx;

	if(!::GetClassInfoEx(hInst,GRID_CTRL_CLASS,&wndClassEx)){

		wndClassEx.cbSize=sizeof(WNDCLASSEX);
		wndClassEx.style=CS_HREDRAW|CS_VREDRAW;
		wndClassEx.lpfnWndProc=::DefWindowProc;
		wndClassEx.cbClsExtra=0;
		wndClassEx.cbWndExtra=0;
		wndClassEx.hInstance=AfxGetInstanceHandle();
		wndClassEx.hIcon=0;
		wndClassEx.hCursor=::LoadCursor(NULL,IDC_ARROW);
		wndClassEx.hbrBackground=CreateSolidBrush(G_BKGND);
		wndClassEx.lpszMenuName=0;
		wndClassEx.lpszClassName=GRID_CTRL_CLASS;
		wndClassEx.hIconSm=0;

		if(!::RegisterClassEx(&wndClassEx))AfxThrowResourceException();
	}

	m_brGHeader.CreateSolidBrush(G_GHEAD_CLR);
	m_brIHeader.CreateSolidBrush(G_IHEAD_CLR);
}
CGridCtrl::~CGridCtrl(){
}

BEGIN_MESSAGE_MAP(CGridCtrl,CWnd)
	ON_WM_CTLCOLOR()
	ON_WM_DESTROY()
	ON_WM_SIZE()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

bool CGridCtrl::Create(DWORD dwStyle,RECT& rct,CWnd* pParent,UINT nID){
	m_dwStyle=dwStyle;
	m_rct=rct;

	if(m_dwStyle&GS_AUTOVSIZE)m_rct.bottom=m_rct.top;
	
	if(!CWnd::CreateEx(WS_EX_CONTROLPARENT,GRID_CTRL_CLASS,0,WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,m_rct,pParent,nID))return false;

	return true;
}

void CGridCtrl::Recalc(){
	GetClientRect(&m_rct);
	m_rct.bottom=m_rct.top;

	_ThisObj::Recalc();

	if(m_dwStyle&GS_AUTOVSIZE){
		CRect rct;
		GetWindowRect(&rct);

		GetParent()->ScreenToClient(&rct);
		rct.bottom=rct.top+m_rct.bottom;

		MoveWindow(&rct);

	}else Invalidate();
}

void CGridCtrl::PreSubclassWindow(){

	m_pGridMgr=new _GridMgr(this,*static_cast<_ThisObj*>(this));

	CWnd::PreSubclassWindow();
}
void CGridCtrl::OnDestroy(){

	delete m_pGridMgr;

	CWnd::OnDestroy();
}
HBRUSH CGridCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){
	HBRUSH hbr=CWnd::OnCtlColor(pDC, pWnd, nCtlColor);

	pDC->SetBkMode(TRANSPARENT);

	UINT nID(pWnd->GetDlgCtrlID());

	switch(nCtlColor){
		case CTLCOLOR_STATIC:
			if(nID==GI_GHEAD_ID)hbr=m_brGHeader;
			else if(nID==GI_IHEAD_ID)hbr=m_brIHeader;
			break;
	}
	return hbr;
}
void CGridCtrl::OnSize(UINT nType, int cx, int cy){
	CWnd::OnSize(nType,cx,cy);
	Recalc();
}
void CGridCtrl::OnMouseMove(UINT nFlags, CPoint point){
	__super::OnMouseMove(nFlags, point);
	
	if(m_bMoveSprt){
		point.x-=GITEM_X_SEP/2-1;
		int nXLen(m_pHitCol->m_rct.right-m_pHitCol->m_rct.left);
		int nXPoint(point.x-m_pHitCol->m_rct.left);

		m_pHitCol->m_nXSprtPercent=int(double(nXPoint)/(double(nXLen)/100.));

		if(m_pHitCol->m_nXSprtPercent<15)m_pHitCol->m_nXSprtPercent=15;
		else if(m_pHitCol->m_nXSprtPercent>85)m_pHitCol->m_nXSprtPercent=85;
		
		m_pHitCol->Recalc();

		return;
	}

	m_pHitCol=0;

	_ThisObj::ObjItr itrHdrRow(m_ObjCnt.begin());

	while(itrHdrRow!=m_ObjCnt.end()){
		CRect rct((*itrHdrRow)->m_rct);

		if(rct.PtInRect(point)){
		
			SRowImpl<SHdr>::ObjItr itrHdr((*itrHdrRow)->m_ObjCnt.begin());

			while(itrHdr!=(*itrHdrRow)->m_ObjCnt.end()){
				CRect rct((*itrHdr)->m_rct);
				if(rct.PtInRect(point)){

					SHdr::ObjItr itrItemCol((*itrHdr)->m_ObjCnt.begin());

					while(itrItemCol!=(*itrHdr)->m_ObjCnt.end()){
						CRect rct((*itrItemCol)->m_rct);
						if(point.x-(*itrItemCol)->m_rct.left>=(*itrItemCol)->m_nXSprtPixel&&point.x-(*itrItemCol)->m_rct.left<=(*itrItemCol)->m_nXSprtPixel+GITEM_X_SEP&&
							point.y>(*itrItemCol)->m_rct.top&&point.y<(*itrItemCol)->m_rct.bottom){
							m_pHitCol=*itrItemCol;

							SetCapture();
							SetCursor(::LoadCursor(0,IDC_SIZEWE));
							
							return;
						}
						itrItemCol++;					
					}
				}
				itrHdr++;
			}
		}
		itrHdrRow++;
	}
	ReleaseCapture();
}
void CGridCtrl::OnLButtonDown(UINT nFlags, CPoint point){
	if(m_pHitCol)m_bMoveSprt=true;
	__super::OnLButtonDown(nFlags, point);
}

void CGridCtrl::OnLButtonUp(UINT nFlags, CPoint point){
	m_bMoveSprt=false;
	__super::OnLButtonUp(nFlags, point);
}
BOOL CGridCtrl::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo){
	if(__super::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))return true;
    return GetOwner()->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

⌨️ 快捷键说明

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