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 + -
显示快捷键?