mfc在对话框绘柱形图

1.首先在resource的dialog中插入新的对话框,并为它新建一个类,命名为CDrawDlg。

2.为CDrawDlg类添加WM_PAINT消息处理和成员变量(我做的是一个商品总额统计)

//成员变量
int num_rect;//用于记录你要作的柱形数,即你的商品类数
double max_money;//记录你要作的柱形图中最高的高度;即你的各类总金额中最大的那一类
double *goods_num;//用于记录各类商品的总数;
double *goods_money;//用于记录各类商品总金额;
double *goods_money_draw;//用于备份*goods_money中的数据;

为了初始化成员变量,我又添加了一个成员函数

//初始化类内的成员变量

void CDrawDlg::DrawPrev(int draw_type_num, int *g_n, double *g_s){        
  num_rect=draw_type_num;
  goods_num=new int[num_rect];
  goods_money=new double[num_rect];
  goods_money_draw=new double[num_rect];
  for(int i=0;i<num_rect;i++){
    goods_num[i]=g_n[i];
    goods_money[i]=g_s[i];
    goods_money_draw[i]=g_s[i];
  }
  max_money=goods_money[0];//选出最大的金额,假设是第一个最大
  for(i=0;i<num_rect;i++){
    if(max_money<goods_money[i]){
      max_money=goods_money[i];
    }
  }
}

//接下来是绘图操作
//绘图
void CDrawDlg::OnPaint(){
  CPaintDC dc(this); // device context for painting

  // TODO: Add your message handler code here
  CRect rc; //创建一个矩形,
  GetClientRect(rc); //获取对话框客户区的矩形;
  rc.DeflateRect(80,20); //缩小矩形大小,不让柱形图和对话框的边重合;

  int nSegWidth=rc.Width()/num_rect; //计算每个条形的宽度,num_rect是你要画的柱形图的柱形数;

  //接下来是作除法处理,求出单位高度,为保证单位高度大于1,将max_money缩小,并记录缩小倍数

  int count=0;
  while(rc.Height()<(int)max_money){
    max_money/=2;
    count++;
  }

  int  nSegHeight=(int)(rc.Height()/max_money);//计算柱形的单位高度

  //其他数据也作缩小处理

  for(int i=0;i<num_rect;i++){
    for(int j=0;j<count;j++){
      goods_money[i]/=2;
    }
  }

  //

  COLORREF crSeg=RGB(0,0,192); //设置颜色
  CBrush brush1(HS_FDIAGONAL,crSeg); //设置画刷1
  CBrush brush2(HS_BDIAGONAL,crSeg); //设置画刷2
  CPen pen(PS_INSIDEFRAME,2,crSeg); //设置画笔
  CBrush* oldBrush=dc.SelectObject(&brush1);
  CPen* oldPen=dc.SelectObject(&pen);
  CRect rcSeg(rc); //创建一个矩形,后来的画柱形就是画它,改变他的高度度,宽度
  rcSeg.right=rcSeg.left+nSegWidth;


  //这是用来写在每个条形下面的文字,修改程序的时候要重写,不够灵活
  CString strSeg[]={"饮料","零食","学习用具","生活用品","其他"};

  CRect rcStr;
  for(i=0;i<num_rect;i++){
    if(i%2)
      dc.SelectObject(&brush1);
    else
      dc.SelectObject(&brush2);
    rcSeg.top=rcSeg.bottom-(int)(goods_money[i]*nSegHeight)-2;//计算每个条形的高度;
    dc.Rectangle(rcSeg);
    if(goods_num[i]>0){
    CString str;
    str.Format("%0.2lf元",goods_money_draw[i]);//在条形图上输出文字
    dc.DrawText(str,rcSeg,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
  }
  rcStr=rcSeg;
  rcStr.top=rcStr.bottom+2;
  rcStr.bottom+=20;
  dc.DrawText(strSeg[i],rcStr,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
  rcSeg.OffsetRect(nSegWidth,0); //将矩形右移;
  }
  dc.SelectObject(oldBrush);

  dc.SelectObject(oldPen);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

至尊小毛毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值