multiboardctl.cpp

来自「MULTI BORAD 控制」· C++ 代码 · 共 654 行 · 第 1/2 页

CPP
654
字号
		for(i = 0; i < nBoardNum ; i++)
		{
			p[i] = m_pSingleBoard[i]; 
		}
	}
	if(m_pSingleBoard != NULL)
	{
		delete []m_pSingleBoard;		
	}
	m_pSingleBoard = p;
	p = NULL;
	m_iBoardNum = nBoardNum;
	Invalidate();
}

short CMultiBoardCtrl::GetBoardNum() 
{
	return m_iBoardNum;
}

void CMultiBoardCtrl::SetBoardWidth(short nBoardWidth) 
{
	if((nBoardWidth <= 0) || (nBoardWidth >= 32767) )return;
	m_iBoardWidth = nBoardWidth;
	Invalidate();
}

short CMultiBoardCtrl::GetBoardWidth() 
{
	return m_iBoardWidth;
}

void CMultiBoardCtrl::SetSpace(short nSpace) 
{
	if((nSpace <= 0) || (nSpace >= 32767) )return;
	m_iSpace = nSpace;
	Invalidate();
}

short CMultiBoardCtrl::GetSpace() 
{
	return m_iSpace;
}

void CMultiBoardCtrl::OnSize(UINT nType, int cx, int cy) 
{
	COleControl::OnSize(nType, cx, cy);	
}

void CMultiBoardCtrl::Display(CDC *pDC)
{
	if(m_pSingleBoard == NULL) return;
	
	if(pDC == NULL) return;
	
	CRect rectClient;
	GetClientRect(&rectClient);
	LONG rectLeft = rectClient.left + m_marginLeft;
	LONG rectTop =  rectClient.top + m_marginTop;
	LONG rectBottom = rectClient.bottom -m_marginBottom;
	int i = 0;
	for(i =0; i < m_iBoardNum;i++)
	{
		if(i != 0){
			rectLeft += (m_iBoardWidth+m_iSpace);
		}
		m_pSingleBoard[i].m_rectBoard.SetRect(rectLeft,rectTop,rectLeft+m_iBoardWidth,rectBottom);
		m_pSingleBoard[i].m_iBoardID = i;
		
		m_pSingleBoard[i].m_rectIcon.left = m_pSingleBoard[i].m_rectBoard.CenterPoint().x - m_iBoardIconWidth/2;
		m_pSingleBoard[i].m_rectIcon.right = m_pSingleBoard[i].m_rectBoard.CenterPoint().x + m_iBoardIconWidth/2;
		m_pSingleBoard[i].m_rectIcon.top = m_pSingleBoard[i].m_rectBoard.CenterPoint().y - m_iBoardIconHeight/2;
		m_pSingleBoard[i].m_rectIcon.bottom = m_pSingleBoard[i].m_rectBoard.CenterPoint().y + m_iBoardIconHeight/2;
		
		if((m_iSelBoardID == i) && m_bSelBoard )
		{
			CPen penBack(PS_DASHDOTDOT,1,RGB(0,255,0));
			CPen *pOldPen;
			pOldPen = pDC->SelectObject(&penBack);
			CRect rect = m_pSingleBoard[i].m_rectBoard;
			rect.InflateRect(2,2,1,1);
			pDC->Rectangle(rect);
			pDC->SelectObject(pOldPen);
			penBack.DeleteObject();
		}

		if(m_pSingleBoard[i].m_iBoardState == 0)//SunKey
		{	
			pDC->FillSolidRect(m_pSingleBoard[i].m_rectBoard,m_pSingleBoard[i].m_crBack);
		}
		else if(m_pSingleBoard[i].m_iBoardState == 1)//Button
		{
			pDC->DrawFrameControl(m_pSingleBoard[i].m_rectBoard,DFC_BUTTON,DFCS_BUTTONPUSH|DFCS_BUTTON3STATE);
		}		
		
		DrawBoardText(pDC,i);
		DrawBoardCircle(pDC,i);
//		DrawBoardIcon(pDC,i);
	}
}

int CMultiBoardCtrl::HitTestEx(const CPoint &point, int &index)
{
	int i =0;
	for(i = 0; i < m_iBoardNum; i++)
	{
		if(m_pSingleBoard[i].m_rectBoard.PtInRect(point))
		{
			index = i;
			return i;
		}
	}
	return -1;
}

void CMultiBoardCtrl::OnColorBackgroundChanged() 
{	
	SetModifiedFlag();
}


void CMultiBoardCtrl::SetBoardText(short nBoardID, LPCTSTR strText) 
{
	if(nBoardID <0 || nBoardID >= m_iBoardNum) return;
	m_pSingleBoard[nBoardID].m_strText = strText;
	InvalidateRect(m_pSingleBoard[nBoardID].m_rectBoard);
}

void CMultiBoardCtrl::SetBoardIcon(short nBoardID, short hIconID) 
{
	if(nBoardID < 0 || nBoardID >= m_iBoardNum) return;
	//m_pSingleBoard[nBoardID].m_hicon = LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(hIconID));
//	HICON hicon = NULL;
//	hicon = LoadIcon((HINSTANCE)m_reshInst,MAKEINTRESOURCE(hIconID));	
//	m_pSingleBoard[nBoardID].m_hicon = SetIcon(hicon,FALSE);//导致第一个板的图标不能正常显示

	m_pSingleBoard[nBoardID].m_hicon = LoadIcon((HINSTANCE)m_reshInst,MAKEINTRESOURCE(hIconID));
	
	m_pSingleBoard[nBoardID].m_iconID = hIconID;

	InvalidateRect(m_pSingleBoard[nBoardID].m_rectIcon);
}

void CMultiBoardCtrl::DrawBoardText(CDC *pDC,short nBoardID)
{
	if(pDC == NULL) return;
	pDC->SetBkMode(TRANSPARENT);
	pDC->DrawText(m_pSingleBoard[nBoardID].m_strText,m_pSingleBoard[nBoardID].m_rectBoard,
		DT_CENTER|DT_WORDBREAK|DT_INTERNAL);	
}

void CMultiBoardCtrl::DrawBoardIcon(CDC *pDC,short nBoardID)
{
	if(pDC == NULL) return;
	::DrawIconEx(pDC->m_hDC,
		m_pSingleBoard[nBoardID].m_rectIcon.left,m_pSingleBoard[nBoardID].m_rectIcon.top,
		m_pSingleBoard[nBoardID].m_hicon,
		m_pSingleBoard[nBoardID].m_rectIcon.Width(),m_pSingleBoard[nBoardID].m_rectIcon.Height(),
		NULL,NULL,DI_NORMAL);
}

void CMultiBoardCtrl::SetBoardIconWidth(short nWidth) 
{
	m_iBoardIconWidth = nWidth;
	Invalidate();	
}

short CMultiBoardCtrl::GetBaordIconWidth() 
{	
	return m_iBoardIconWidth;
}

short CMultiBoardCtrl::GetBoardIconHeight() 
{
	return m_iBoardIconHeight;
}

void CMultiBoardCtrl::SetBoardIconHeight(short nHeight) 
{
	m_iBoardIconHeight = nHeight;
	Invalidate();
}

void CMultiBoardCtrl::OnMarginLeftChanged() 
{
	SetModifiedFlag();
}

void CMultiBoardCtrl::OnMarginTopChanged() 
{	
	SetModifiedFlag();
}

void CMultiBoardCtrl::OnMarginBottomChanged() 
{
	SetModifiedFlag();
}

void CMultiBoardCtrl::SetBoardCircle(short nBoardID, OLE_COLOR crColor) 
{
	if(nBoardID <0 || nBoardID >= m_iBoardNum ) return;
	if(crColor == 0)
	{
		m_pSingleBoard[nBoardID].m_crColor = ::GetSysColor(COLOR_3DFACE);
	}
	else
	{	
		m_pSingleBoard[nBoardID].m_crColor = crColor;
	}
	InvalidateRect(m_pSingleBoard[nBoardID].m_rectIcon);
}

void CMultiBoardCtrl::DrawBoardCircle(CDC *pDC,short nBoardID)
{
	if(pDC == NULL) return;
//	COLORREF bushColor;
//	bushColor = RGB(0,0,255);
	CBrush brush(m_pSingleBoard[nBoardID].m_crColor);
	//CPen  penBackColor(PS_SOLID,2,::GetSysColor(COLOR_3DFACE));
	CPen  penBackColor(PS_SOLID,2,m_pSingleBoard[nBoardID].m_crColor);
	CPen * pOldPen;
	CBrush* pOldBrush;
	pOldPen = pDC->SelectObject(&penBackColor);
	pOldBrush = pDC->SelectObject(&brush);
	CRect rect = m_pSingleBoard[nBoardID].m_rectIcon;
	rect.DeflateRect(1,1);
	pDC->Ellipse(rect);
	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);
}

OLE_COLOR CMultiBoardCtrl::GetBoardCircle(short nBoardID) 
{
	if(nBoardID <0 || nBoardID >= m_iBoardNum ) return -1;	
	return m_pSingleBoard[nBoardID].m_crColor;
	//return RGB(0,0,0);
}

void CMultiBoardCtrl::OnKillFocus(CWnd* pNewWnd) 
{
	COleControl::OnKillFocus(pNewWnd);

	m_iSelBoardID = -1;	
	m_bSelBoard = FALSE;
	Invalidate();
}

void CMultiBoardCtrl::OnReshInstChanged() 
{
	// TODO: Add notification handler code

	SetModifiedFlag();
}

short CMultiBoardCtrl::GetBoardState(short nBoardID) 
{	
	if(nBoardID <0 || nBoardID >= m_iBoardNum ) return -1;	
	return m_pSingleBoard[nBoardID].m_iBoardState;
	//return 0;
}

void CMultiBoardCtrl::SetBoardState(short nBoardID, short nState) 
{
	if(nBoardID <0 || nBoardID >= m_iBoardNum ) return ;
	m_pSingleBoard[nBoardID].m_iBoardState = nState;
	if(nState == 0)
	{
		m_pSingleBoard[nBoardID].m_crBack = ::GetSysColor(COLOR_3DFACE) - 64;
	}
	else if(nState == 1)
	{
		m_pSingleBoard[nBoardID].m_crBack = ::GetSysColor(COLOR_3DFACE) ;
	}
	InvalidateRect(m_pSingleBoard[nBoardID].m_rectBoard);
}

void CMultiBoardCtrl::OnDestroy() 
{
	COleControl::OnDestroy();
}

short CMultiBoardCtrl::GetBoardIconID(short nBoardID) 
{
	return m_pSingleBoard[nBoardID].m_iconID;
}

BOOL CMultiBoardCtrl::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	CWnd *pWnd = this;
	return pWnd->Create("MULTIBOARD",lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
//	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

int CMultiBoardCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (COleControl::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	return 0;
}

BSTR CMultiBoardCtrl::GetBoardText(short nBoardID) 
{
	CString strResult;
	// TODO: Add your dispatch handler code here
	if(nBoardID <0 || nBoardID >= m_iBoardNum ) return NULL;	
	strResult = m_pSingleBoard[nBoardID].m_strText;
	return strResult.AllocSysString();
}

void CMultiBoardCtrl::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	CRect rcBounds;
	GetClientRect(&rcBounds);
	CDCMemory *pDCMem = new CDCMemory(&dc,rcBounds);
	pDCMem->FillSolidRect(rcBounds,m_colorBackground);
	pDCMem->DrawEdge((LPRECT)&rcBounds,BDR_SUNKENOUTER,BF_RECT);	
	Display(pDCMem);
	if(pDCMem != NULL) delete pDCMem;
	
	// Do not call COleControl::OnPaint() for painting messages
}

⌨️ 快捷键说明

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