VC绘制简易图表模块代码

 // Linepic.cpp: implementation of the CLinepic class.
//本模块为绘图模块,再获取到设备上下文后,即可绘制,但需窗体模块在需要时
//调用InvalidateRect(Rect* rect)使绘图区失效,从而触发Onpaint事件。同时,
//需要在窗体的Onpaint函数中添加函数,将内存dc中绘制的图形拷至窗体的dc中
//created by huang.haihong
//

#include "stdafx.h"
#include "GDB Tool.h"
#include "Linepic.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//
// Construction/Destruction
//

CLinepic::CLinepic()
{
 
}

CLinepic::CLinepic(CDC* dc)
{
 int i;
 m_dcline = dc;
 m_dcMemL.CreateCompatibleDC(m_dcline);
 m_deMemOld.CreateCompatibleDC(m_dcline);
 m_dcline->GetBoundsRect(&m_rcclient,0);
 xUnit = 10;
 yUnit = 10;
 xscale = 1;
 yscale = 1;
 for(i=0;i<5;i++)
 {
  pointlast[i].x = 0;
  pointlast[i].y = 0;
 }
 XOvalue = 0;
 topempty = 30;
 leftempty = 30;
 m_legend[0] = "";
 m_legend[1] = "";
 m_legend[2] = "";
 m_legend[3] = "";
 m_legend[4] = "";
 m_picname = "Table1";
}

CLinepic::~CLinepic()
{
 m_dcMemL.DeleteDC();
 m_deMemOld.DeleteDC();
}

BOOL CLinepic::MoveRange(int xoff)
{
 int oldw;
 
 oldw = m_rcclient.right-xoff;
 XOvalue += xoff;

 //复制原图至副本中
 //只复制不会重画的部分
 m_bmpold.CreateCompatibleBitmap(m_dcline,oldw,m_rcclient.bottom-topempty);
 m_deMemOld.SelectObject(&m_bmpold);
 m_deMemOld.BitBlt(0,0,oldw,m_rcclient.bottom-topempty,
                   &m_dcMemL,xoff,topempty,SRCCOPY);
 //复制副本至原图中
 m_dcMemL.SelectObject(&m_bmp);
 m_dcMemL.BitBlt(0,topempty,oldw,m_rcclient.bottom-topempty,
                   &m_deMemOld,0,0,SRCCOPY);
 DrawRect(oldw,topempty,m_rcclient.right,m_rcclient.bottom);
 //deleteobject;
 DrawGrid(oldw,0);
 DrawAxisTitle();
 
 m_bmpold.DeleteObject();
 m_bmp.DeleteObject();
 
 return TRUE;
}
/*扩大图像画布*/
BOOL CLinepic::SetRange(int width,int height)
{
 int oldw,oldh;
 
 oldw = m_rcclient.right;
 oldh = m_rcclient.bottom;
 m_rcclient.bottom = height;
 m_rcclient.right = width;

 //复制原图至副本中
 //只复制不会重画的部分
 m_bmpold.CreateCompatibleBitmap(m_dcline,oldw,(oldh-m_rcclient.bottom%yUnit));
 m_deMemOld.SelectObject(&m_bmpold);
 m_deMemOld.BitBlt(0,0,oldw,oldh,
                   &m_dcMemL,0,0,SRCCOPY);
 //重新生成原图
 m_bmp.CreateCompatibleBitmap(m_dcline,width,height);
 EraseBkgrd();
 //复制副本至原图中
 m_dcMemL.SelectObject(&m_bmp);
 m_dcMemL.BitBlt(0,0,oldw,oldh,
                   &m_deMemOld,0,0,SRCCOPY);
 //deleteobject;
 m_bmpold.DeleteObject();
 m_bmp.DeleteObject();

 return TRUE;
}
/*重置图像*/
BOOL CLinepic::ReSetRange(int width,int height)
{
 m_bmp.CreateCompatibleBitmap(m_dcline,width,height);
 m_rcclient.bottom = height;
 m_rcclient.right = width;
 XOvalue = 0;
 EraseBkgrd();
 return TRUE;
}

BOOL CLinepic::DrawRect(int x1,int y1,int x2,int y2,COLORREF color)
{
 m_dcMemL.SelectStockObject(NULL_PEN);
 m_hBrushNew.CreateSolidBrush(color);
 VERIFY(m_hBrushOld = m_dcMemL.SelectObject(&m_hBrushNew));
 m_dcMemL.Rectangle(x1, y1, x2, y2);
 m_dcMemL.SelectObject(m_hBrushOld);
 m_hBrushNew.DeleteObject();
 return TRUE;
}

CDC* CLinepic::GetMemDC()
{
 return (&m_dcMemL);
}

BOOL CLinepic::EraseBkgrd()
{
// m_hPenNew.CreatePen(PS_SOLID,1,RGB(0,0,0));
 m_dcMemL.SelectObject(&m_bmp);
// VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
 m_dcMemL.SelectStockObject(NULL_PEN);
 m_hBrushNew.CreateSolidBrush(RGB(0,0,0));
 VERIFY(m_hBrushOld = m_dcMemL.SelectObject(&m_hBrushNew));
 m_dcMemL.Rectangle(0,0,m_rcclient.right+1,m_rcclient.bottom);
// m_dcMemL.TextOut(0,0,"abc"); 
// m_dcMemL.SelectObject(m_hPenOld);
 m_dcMemL.SelectObject(m_hBrushOld);
// m_hPenNew.DeleteObject();
 m_hBrushNew.DeleteObject();
 m_bmp.DeleteObject();
 DrawGrid(0,0);
// DrawAxis();
// DrawAxisTitle();
 DrawTitle();
 DrawLegend();
 return TRUE;
}

BOOL CLinepic::DrawCircle(int topx,int topy,int radius)
{
 //新建图型对象
 m_hPenNew.CreatePen(PS_SOLID,1,RGB(255,0,255));
 m_hBrushNew.CreateSolidBrush(RGB(255,255,0));
 //重选图型对象
 m_dcMemL.SelectObject(&m_bmp);
 VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew)); 
 VERIFY(m_hBrushOld = m_dcMemL.SelectObject(&m_hBrushNew));
 //画圆
 m_dcMemL.Ellipse(topx,topy,topx+radius,topy+radius);
 //delete object
 m_dcMemL.SelectObject(m_hPenOld);
 m_dcMemL.SelectObject(m_hBrushOld);
 m_hPenNew.DeleteObject();
 m_hBrushNew.DeleteObject();
 m_bmp.DeleteObject();

 return TRUE;
}

BOOL CLinepic::DrawGrid(int x, int y)
{
 int i, j;                                   
               
 m_hPenNew.CreatePen(PS_SOLID,1,RGB(0,100,0));
 VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew)); 
/*
 for(i = (x-leftempty)/xUnit+1; i <= (m_rcclient.right/xUnit); i ++)
 {
  m_dcMemL.MoveTo(i*xUnit+(xUnit-(XOvalue-leftempty)%xUnit),topempty);  
  m_dcMemL.LineTo(i*xUnit+(xUnit-(XOvalue-leftempty)%xUnit),m_rcclient.bottom); 
 }
*/
 for(i = x/xUnit; i <= (m_rcclient.right/xUnit); i ++)
 {
  m_dcMemL.MoveTo(i*xUnit+(xUnit-XOvalue%xUnit),topempty);  
  m_dcMemL.LineTo(i*xUnit+(xUnit-XOvalue%xUnit),m_rcclient.bottom); 
 }

 for(j = 0; j <= (m_rcclient.bottom/yUnit); j ++)
 {
  m_dcMemL.MoveTo(x,j*yUnit+topempty);  
  m_dcMemL.LineTo(m_rcclient.right,j*yUnit+topempty); 
 }

 m_dcMemL.SelectObject(m_hPenOld);
 m_hPenNew.DeleteObject();


 return TRUE;
}

BOOL CLinepic::DrawAxis()
{
 int i;
 int y = ((m_rcclient.bottom)/yUnit-1)*yUnit;
 int x = (m_rcclient.right/xUnit-1)*xUnit;
 POINT points[3];
 points[0].x = 30;
 points[0].y = 0;
 points[1].x = 25;
 points[1].y = 20;
 points[2].x = 35;
 points[2].y = 20;

 m_hPenNew.CreatePen(PS_SOLID,2,RGB(0,0,255));
 VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
 m_dcMemL.SelectStockObject(NULL_BRUSH);

 for(i=0;i<=y;i++)
 {
  m_dcMemL.MoveTo(30,y-i*yUnit);  
  m_dcMemL.LineTo(25,y-i*yUnit);
 }
 for(i=0;i<=x;i++)
 {
  m_dcMemL.MoveTo(xUnit*i+(xUnit-(XOvalue-30)%xUnit),y);  
  m_dcMemL.LineTo(xUnit*i+(xUnit-(XOvalue-30)%xUnit),y+5);
 }

 //m_dcMemL.Rectangle(30,0,m_rcclient.right-2,y+1);
 m_dcMemL.MoveTo(30,0);  
 m_dcMemL.LineTo(30,y);
 m_dcMemL.MoveTo(30,y);  
 m_dcMemL.LineTo(m_rcclient.right-2,y);


 m_hBrushNew.CreateSolidBrush(RGB(0,0,255));
 VERIFY(m_hBrushOld = m_dcMemL.SelectObject(&m_hBrushNew));

 m_dcMemL.Polygon(points,3);

/* x = m_rcclient.right;
 y = m_rcclient.bottom - (m_rcclient.bottom % yUnit) - 30;
 points[0].x = x;
 points[0].y = y;
 points[1].x = x-20;
 points[1].y = y-5;
 points[2].x = x-20;
 points[2].y = y+5;
 m_dcMemL.Polygon(points,3);*/

 m_dcMemL.SelectObject(m_hPenOld);
 m_hPenNew.DeleteObject();
 m_dcMemL.SelectObject(m_hBrushOld);
 m_hBrushNew.DeleteObject();

 return TRUE;
}

BOOL CLinepic::DrawMarker(int x,int y,int index,BOOL bmark)
{
 int xc,yc,xold,yold,xover,yover;
 COLORREF color;
 switch (index)
 {
 case 0:
  { 
  color = RGB(0,255,0);
  break;
  }
 case 1:
  { 
  color = RGB(255,255,0);
  break;
  }
 case 2:
  { 
  color = RGB(255,0,0);
  break;
  }
 case 3:
  { 
  color = RGB(255,0,255);
  break;
  }
 case 4:
  { 
  color = RGB(0,255,255);
  break;
  }
 default:
  { 
  color = RGB(255,255,255);
  break;
  }
 }
 /*
 xc = x*xUnit/xscale+30-XOvalue;
 yc = m_rcclient.bottom-y*yUnit/yscale;
 xold = pointlast[index].x*xUnit/xscale+30;
 yold = m_rcclient.bottom-pointlast[index].y*yUnit/yscale;*/

 xc = x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;//-1避开重绘区
 yc = m_rcclient.bottom-y*yUnit/yscale;
 xold = pointlast[index].x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;
 yold = m_rcclient.bottom-pointlast[index].y*yUnit/yscale;
 if(yc>=m_rcclient.bottom)
  yc=m_rcclient.bottom-1;
 if(yold>=m_rcclient.bottom)
  yold=m_rcclient.bottom-1;

/*  xc = x*xUnit/xscale+30-XOvalue;
  xold = pointlast[index].x*xUnit/xscale+30-XOvalue;*/
 if(xc>m_rcclient.right-5)
 {
  MoveRange(xc-m_rcclient.right+5);
  xc = x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;
  xold = pointlast[index].x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;
 }
 if (bmark)
 {
  m_hPenNew.CreatePen(PS_SOLID,2,color);
  VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
  
  POINT  p[4];
  p[0].x = xc - 4;
  p[0].y = yc;
  p[1].x = xc;
  p[1].y = yc + 4;
  p[2].x = xc + 4;
  p[2].y = yc;
  p[3].x = xc;
  p[3].y = yc - 4;
  m_dcMemL.Polygon(p, 4);

  m_dcMemL.SelectObject(m_hPenOld);
  m_hPenNew.DeleteObject();
 }

 m_hPenNew.CreatePen(PS_SOLID,1,color);
 VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));

// m_dcMemL.SelectStockObject(BLACK_PEN);
/* if(pointlast[index].x!=0)
 {*/
  if(yc<topempty&&yold<topempty)
  {
   m_dcMemL.MoveTo(xold-1,topempty);
   m_dcMemL.LineTo(xc,topempty);
  }
  else if(yc<topempty)
  {
   xover = xc-(topempty-yc)*(xc-xold)/(yold-yc);
   yover = topempty;
   m_dcMemL.MoveTo(xold,yold);
   m_dcMemL.LineTo(xover,yover);
   m_dcMemL.MoveTo(xover,topempty);
   m_dcMemL.LineTo(xc,topempty);
  }
  else if(yold<topempty)
  {
   xover = (topempty-yold)*(xc-xold)/(yc-yold)+xold;
   yover = topempty;
   m_dcMemL.MoveTo(xover,yover);
   m_dcMemL.LineTo(xc,yc);
   m_dcMemL.MoveTo(xover,topempty);
   m_dcMemL.LineTo(xold-1,topempty);
  }
  else
  {
   m_dcMemL.MoveTo(xold,yold);
   m_dcMemL.LineTo(xc,yc);
  }
/* }
 else
 {
  m_dcMemL.MoveTo(xc,m_rcclient.bottom);
  m_dcMemL.LineTo(xc,yc);
 }*/
/* if(0==pointlast[index].x)
 {
  ;//m_dcMemL.MoveTo(xold,yold);
  //m_dcMemL.LineTo(xc,yc);
 }
 else
 {
  m_dcMemL.MoveTo(xold,yold);
  m_dcMemL.LineTo(xover,yover);
 }*/

 m_dcMemL.SelectObject(m_hPenOld);
 m_hPenNew.DeleteObject();

 pointlast[index].x = x;
 pointlast[index].y = y;

 return TRUE;
}

CRect* CLinepic::GetRect()
{
 return (&m_rcclient);
}

BOOL CLinepic::SetScale(int xs, int ys)
{
 xscale = xs;
 yscale = ys;
 DrawAxisTitle();
 EraseBkgrd();
 return true;
}

BOOL CLinepic::DrawTitle()
{
 m_dcMemL.SetBkColor(RGB(0,0,0));
 m_dcMemL.SetTextColor(RGB(0,255,0));

 m_hPenNew.CreatePen(PS_SOLID,1,RGB(255,255,150));
 VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
 m_dcMemL.SelectStockObject(NULL_BRUSH);
 
 m_dcMemL.MoveTo(0,topempty-1);
 m_dcMemL.LineTo(m_rcclient.right,topempty-1);
/*
 m_dcMemL.SelectObject(m_hPenOld);
 m_hPenNew.DeleteObject();
 m_hPenNew.CreatePen(PS_SOLID,1,RGB(200,200,255));
 VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
 m_dcMemL.MoveTo(0,topempty-2);
 m_dcMemL.LineTo(m_rcclient.right,topempty-2);
/**/

 VERIFY(m_pNewFont.CreatePointFont(110, "宋体", &m_dcMemL));
 m_pOldFont = m_dcMemL.SelectObject(&m_pNewFont);

 m_dcMemL.TextOut(280,0,m_picname);

 m_dcMemL.SelectObject(m_pOldFont);
 m_pNewFont.DeleteObject();
 m_dcMemL.SelectObject(m_hPenOld);
 m_hPenNew.DeleteObject();

 return true;
}

int CLinepic::GetLastWidth()
{
 return (pointlast[0].x/xscale*xUnit-XOvalue);
}

void CLinepic::SetTitle(CString sztitle)
{
 m_picname = sztitle;
 DrawTitle();
}

void CLinepic::SetLegend(CString szLegend,int index)
{
 if(index>4)
 {
  //AfxMessageBox("本表格最多支持5种标记",MB_OK,0);
  index = 4;
 }
 m_legend[index] = szLegend;
 DrawLegend();
}

BOOL CLinepic::DrawLegend()
{
 COLORREF color[5];
 
 color[0] = RGB(0,255,0);
 color[1] = RGB(255,255,0);
 color[2] = RGB(255,0,0);
 color[3] = RGB(255,0,255);
 color[4] = RGB(0,255,255);
 
 m_dcMemL.SetBkColor(RGB(0,0,0));
 VERIFY(m_pNewFont.CreatePointFont(110, "宋体", &m_dcMemL));
 m_pOldFont = m_dcMemL.SelectObject(&m_pNewFont);
 
 for(int i=0;i<5;i++)
 {
  m_dcMemL.SetTextColor(color[i]);
  m_dcMemL.TextOut(150*i,15,m_legend[i]);
 }
 
 m_dcMemL.SelectObject(m_pOldFont);
 m_pNewFont.DeleteObject();

 return true;
}

BOOL CLinepic::DrawAxisTitle()
{
 CString szAxis;
 int funit;
 funit = yscale;

 m_dcMemL.SetTextColor(RGB(0,255,0));
 m_dcMemL.SetBkColor(RGB(0,0,0));
 szAxis.Format("%d",0);
 m_dcMemL.TextOut(0,m_rcclient.bottom-15,szAxis);

 szAxis.Format("%d",(yscale*(m_rcclient.bottom-topempty)/yUnit)/4);
 m_dcMemL.TextOut(0,(m_rcclient.bottom-topempty)/4*3+topempty,szAxis);

 szAxis.Format("%d",(yscale*(m_rcclient.bottom-topempty)/yUnit)/4*2);
 m_dcMemL.TextOut(0,(m_rcclient.bottom-topempty)/4*2+topempty,szAxis);

 szAxis.Format("%d",(yscale*(m_rcclient.bottom-topempty)/yUnit)/4*3);
 m_dcMemL.TextOut(0,(m_rcclient.bottom-topempty)/4+topempty,szAxis);

 szAxis.Format("%d",(yscale*(m_rcclient.bottom-topempty)/yUnit));
 m_dcMemL.TextOut(0,m_rcclient.top+topempty,szAxis);
 //每隔四分之一个绘图区高度绘制一次y轴的值。
 return true;
}

int CLinepic::GetScale(int type)
{
 switch(type)
 {
 case 1:
  {
   return xscale;
  }
 case 2:
  {
   return yscale;
  }
 default:
  {
   return 0;
  }
 }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值