如何用c++的mfc绘制柱状图

如上面所说

用c++的mfc绘制柱状图的方法如下:

1:取GroupBox的区域,并保存四个值  左,上,右,下

//获取屏幕坐标

((CWnd*)GetDlgItem(IDC_STATIC_CHART))->GetWindowRect(rect);

//计算x轴y轴基本单位

int dx = (rect.right-rect.left)/50;

int dy = (rect.bottom-rect.top)/80;

//转换成对话框坐标

ScreenToClient(rect);

//保存4个值

int L = rect.left,R = rect.right,T = rect.top,B = rect.bottom;

GroupBox的区域我忘记标出来了,就在上面图中柱状图那一块

2:获取DC,这一步没什么好说的

CPaintDC dc(this);

3:画X轴,Y轴

//X

dc.MoveTo(L+dx*2,B-dy*3);

dc.LineTo(L+dx*49,B-dy*3);

//最后的那个箭头

dc.MoveTo(L+dx*49,B-dy*3);

dc.LineTo(L+dx*48,B-dy*2);

dc.MoveTo(L+dx*49,B-dy*3);

dc.LineTo(L+dx*48,B-dy*4);

Y轴同理,但是考虑到dx,dy的值不一样,当画Y轴的箭头时,需要交换dx和dy的位置

//纵坐标线 dc.MoveTo(L+dx*2,B-dy*3); 

dc.LineTo(L+dx*2,B-dy*77); 

dc.MoveTo(L+dx*2,B-dy*77); 

//交换了dx,dy的位置

dc.LineTo(L+dx*2-dy,B-dy*77+dx); 

dc.MoveTo(L+dx*2,B-dy*77); 

//交换了dx,dy的位置

dc.LineTo(L+dx*2+dy,B-dy*77+dx);

绘制完结果如图:

4:画柱状图,这里主要根据前面计算dx,dy时,划分的数量来计算每个柱的宽度,以及柱间的间隔

//第一个柱状体的左下坐标

int x = L+dx*3;

int y = B-dy*3;

for(int i=0;i

CRect rc;

rc.left=x+i*dx*9;

rc.right=rc.left+dx*7;

rc.bottom=y;

rc.top=rc.bottom-dy*answer[index][i+1];

//这里把柱状图的信息输出,这里输出的是一个数字,因为要转换成字符串,比较麻烦

//处理了一下,肯定有简洁的处理方式,但是我也懒得去想了,我很懒的

dc.SetBkMode(TRANSPARENT);//设置透明背景,要不然输出文字之后会有一块白,难看

char num[10];

sprintf(num,"%d",answer[index][i+1]);

CString strnum(num);

dc.TextOutW((rc.left+rc.right)/2-dx,rc.bottom-dy*(answer[index][i+1]+3),strnum);

//画刷是我之前就定义好的,直接拿来用

dc.FillRect(&rc,brushs+i);

}

5:添加控件消息响应函数

维护一个全局变量index来保存当前题号,创建重绘函数updateInfo

void CEnglishReportDlg::updateInfo(){

int count = choose_c[index];

int i;

//选项存在,赋值,L是宏命令与TEXT()相同功能

for(i=0;i

m_strLable[i] = choose[index][i];

}

//无此选项,置空

for(;i<5;i++)

m_strLable[i] = L"";

m_strTopic = topics[index];

//获取GroupBox区域,并转换成对话框坐标

CRect rect;

((CWnd*)GetDlgItem(IDC_STATIC_CHART))->GetWindowRect(rect);

ScreenToClient(rect);

//重绘此区域

InvalidateRect(rect);

//将控件变量更新到前台

UpdateData(FALSE);

}

函数1:响应ListBox的SelChange事件

void CEnglishReportDlg::OnLbnSelchangeListTopic()

{

// TODO: 在此添加控件通知处理程序代码

index = m_listtopic.GetCurSel();

updateInfo();

}

函数2:上一页按钮的Click事件

void CEnglishReportDlg::OnBnClickedButtonPre()

{

// TODO: 在此添加控件通知处理程序代码

if(index>0)

index--;

updateInfo();

m_listtopic.SetCurSel(index);

}

函数3:下一页按钮的Clicl事件

void CEnglishReportDlg::OnBnClickedButtonNext()

{

// TODO: 在此添加控件通知处理程序代码

if(index<19)

index++;

updateInfo();

m_listtopic.SetCurSel(index);

}

至此基本的功能都已经实现了,还差最后一步:

6:初始化对话框

for(int i=0;i<20;i++){

m_listtopic.AddString(topics[i]);

}

//index初始化为0,直接刷新

updateInfo();

m_listtopic.SetCurSel(index);

运行结果如下:

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-04-25
在对话框界面上画出统计后的柱状图。 提示:在OnPaint()函数中加入画线代码: CDC* pDC = GetDC(); //利用MFC的CDC类实现画线 CPoint pt1,pt2; //定义起点、终点 pt1.x = 100; pt1.y = 100; pt2.x = 200; pt2.y = 200; pDC->MoveTo(pt1); //线的起点 pDC->LineTo(pt2); //线的终点 ReleaseDC(pDC); //释放CDC 满意答案 网友回答 来自太平洋电脑网 - 第一专业IT门户网站2013-07-29读文件: int nData[20]; FILE *fpTxt; if( ( fpTxt = fopen ("C:\\1.txt","r")) == NULL ) { MessageBox("打开文件失败","系统警告",MB_OK); return; } for(int i=0;i>本回答被提问者采纳
第2个回答  2015-10-23
可以用MSChart。
如何用c++的mfc绘制柱状图
1:取GroupBox的区域,并保存四个值 左,上,右,下 \/\/获取屏幕坐标 ((CWnd*)GetDlgItem(IDC_STATIC_CHART))->GetWindowRect(rect);\/\/计算x轴y轴基本单位 int dx = (rect.right-rect.left)\/50;int dy = (rect.bottom-rect.top)\/80;\/\/转换成对话框坐标 Sc

MFC或C++下如何读取Excel文件中的图表(一个柱状图),然后把这个图保存成...
实际上用C++读取到的还是一组数据,柱状图只不过是EXCEL根据数据生成绘制的而已.所以你想用MFC绘制 保存图片,那就需要自己根据数据来调用GUI绘制了, 可以保存为bmp文件.

Qt\/C++编写可视化大屏电子看板系统29-模块7品质管理
1. 品质占比子模块 功能:使用饼图控件以不同颜色显示各部分占比。 实现:通过自定义painter绘制饼图,解决了qchart饼图不支持Qt4的局限。核心在于drawpie函数,该函数实现了饼图的基本绘制。2. 班组合格率子模块 功能:采用柱状图展现不同班次的合格情况,以便进行清晰的对比。 实现:利用Qt\/C++中的...

如何用C++控制读取excel中的数据生成折线图
把EXCEL文档保存为CSV格式。按CSV数据格式读取数据,保存到数组中,然后用MFC的CDC类按照数组数据画图。

余声个人资料
age'],data['salary'])plt.show()```3.绘制柱状图 柱状图是一种常用的数据可视化方式,可以展示数据的分布和差异。可以通过matplotlib库中的bar()函数实现柱状图的绘制。下面是一个绘制柱状图的示例代码:```importmatplotlib.pyplotasplt plt.bar(data['category'],data['salary'])plt.show()```

...如何将这两个在柱状图中同时显示。如图: 将百分比放在数字后面。_百 ...
注意勾选值和百分比,分隔符使用分行符。 本回答由提问者推荐 举报| 答案纠错 | 评论 4 2 绛喵 采纳率:44% 来自团队:小机器人联盟 擅长: C\/C++ C#\/.NET VC++ python PHP 其他回答 在向导里面把值和百分比两个都勾上就行了。在图上右键:数据系列格式--数据标志或者:图表选项--数据标志 ttxwttxw ...

django的mvc是什么(djangomvt)
5、django是做什么的?mvc框架怎么用? MVC(ModelViewController)本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变...

最常用的几个python库
py – 在中日韩语字符和数字字母之间添加空格。pyfiglet -figlet 的 Python实现。shortuuid – 一个生成器库,用以生成简洁的,明白的,URL 安全的 UUID。unidecode – Unicode 文本的 ASCII 转换形式 。uniout – 打印可读的字符,而不是转义的字符串。xpinyin – 一个用于把汉字转换为拼音的库。

相似回答