WEB开发网
开发学院软件开发VC 一个工业控制管道流动控件的实现 阅读

一个工业控制管道流动控件的实现

 2010-07-11 20:44:38 来源:WEB开发网   
核心提示:管道绘制:采用渐变的方法进行管道的绘制,由于在绘图过程中,一个工业控制管道流动控件的实现(2),这里不是经常变化的,只有当管道的颜色发生变化或者其他一些管道的配置发生变化才要重绘,这里进行这个方法的简单的封装,以后还能够用这些方法绘制图形的渐变区域以及工业控制别的控件,我们在双缓冲绘图时只要进行一次绘图就可以了,然后生

管道绘制:

采用渐变的方法进行管道的绘制,由于在绘图过程中,这里不是经常变化的,只有当管道的颜色发生变化或者其他一些管道的配置发生变化才要重绘,我们在双缓冲绘图时只要进行一次绘图就可以了,然后生成绘图句柄到内存,这样可以提高效率。

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;
}

上一页  1 2 3 4 5  下一页

Tags:一个 工业控制 管道

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接