一个工业控制管道流动控件的实现
2010-07-11 20:44:38 来源:WEB开发网管道绘制:
采用渐变的方法进行管道的绘制,由于在绘图过程中,这里不是经常变化的,只有当管道的颜色发生变化或者其他一些管道的配置发生变化才要重绘,我们在双缓冲绘图时只要进行一次绘图就可以了,然后生成绘图句柄到内存,这样可以提高效率。
void CPipeImpl::Draw(CDC *pDC)
{
//用渐变的方法绘制管道
DrawGradient(pDC);
//绘制图形周围的边框
CRect rcClient;
m_pOwer->GetClientRect(&rcClient);
CBrush pBlackBrush(m_colorBorder);
pDC->FrameRect(&rcClient, &pBlackBrush);
}
绘制渐变我们采用一个常用的方法,这里进行这个方法的简单的封装,以后还能够用这些方法绘制图形的渐变区域以及工业控制别的控件,比如容器等。void CPipeImpl::DrawGradient(CDC *pDC)
{
CRect rcClient;
CBitmap MemBmp, *pOldMemBmp;
CDC MemDC;
COLORREF crCur;
CPoint ptCur;
m_pOwer->GetClientRect(&rcClient);
int nWidth = m_pOwer->GetFlowPattern() == FP_HORIZONTAL ?
rcClient.Height() : rcClient.Width();
RGBTRIPLE *pRGBTriple = new RGBTRIPLE[nWidth], *pEntry;
if (pRGBTriple == NULL)
{
return;
}
MemBmp.CreateCompatibleBitmap(pDC,
m_pOwer->GetFlowPattern() == FP_HORIZONTAL ? 1 : rcClient.Width(),
m_pOwer->GetFlowPattern() == FP_HORIZONTAL ? rcClient.Height() : 1);
MemDC.CreateCompatibleDC(pDC);
pOldMemBmp = (CBitmap *)MemDC.SelectObject(&MemBmp);
ptCur = CPoint(0, 0);
m_Gradient.MakeEntries(pRGBTriple, nWidth);
for (int i=0; i<nWidth; i++)
{
if (m_pOwer->GetFlowPattern() == FP_HORIZONTAL)
{
ptCur.y = i;
}
else
{
ptCur.x = i;
}
pEntry = &pRGBTriple[i];
crCur = RGB(pEntry->rgbtRed, pEntry->rgbtGreen, pEntry->rgbtBlue);
MemDC.SetPixelV(ptCur, crCur);
}
if (m_pOwer->GetFlowPattern() == FP_HORIZONTAL)
{
pDC->StretchBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(),
&MemDC, 0, 0, 1, nWidth, SRCCOPY);
}
else
{
pDC->StretchBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(),
&MemDC, 0, 0, nWidth, 1, SRCCOPY);
}
MemDC.SelectObject(pOldMemBmp);
MemBmp.DeleteObject();
MemDC.DeleteDC();
delete [] pRGBTriple;
}
更多精彩
赞助商链接