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