如何用c++的mfc绘制柱状图
发布时间:2025-05-23 17:05:55 发布人:远客网络
一、如何用c++的mfc绘制柱状图
1、用c++的mfc绘制柱状图的方法如下:
2、1:取GroupBox的区域,并保存四个值左,上,右,下
3、((CWnd*)GetDlgItem(IDC_STATIC_CHART))->GetWindowRect(rect);
4、int dx=(rect.right-rect.left)/50;
5、int dy=(rect.bottom-rect.top)/80;
6、int L= rect.left,R= rect.right,T= rect.top,B= rect.bottom;
7、GroupBox的区域我忘记标出来了,就在上面图中柱状图那一块
8、Y轴同理,但是考虑到dx,dy的值不一样,当画Y轴的箭头时,需要交换dx和dy的位置
9、//纵坐标线 dc.MoveTo(L+dx*2,B-dy*3);
10、dc.LineTo(L+dx*2-dy,B-dy*77+dx);
11、dc.LineTo(L+dx*2+dy,B-dy*77+dx);
12、4:画柱状图,这里主要根据前面计算dx,dy时,划分的数量来计算每个柱的宽度,以及柱间的间隔
13、rc.top=rc.bottom-dy*answer[index][i+1];
14、//这里把柱状图的信息输出,这里输出的是一个数字,因为要转换成字符串,比较麻烦
15、//处理了一下,肯定有简洁的处理方式,但是我也懒得去想了,我很懒的
16、dc.SetBkMode(TRANSPARENT);//设置透明背景,要不然输出文字之后会有一块白,难看
17、sprintf(num,"%d",answer[index][i+1]);
18、dc.TextOutW((rc.left+rc.right)/2-dx,rc.bottom-dy*(answer[index][i+1]+3),strnum);
19、//画刷是我之前就定义好的,直接拿来用
20、dc.FillRect(&rc,brushs+i);
21、维护一个全局变量index来保存当前题号,创建重绘函数updateInfo
22、void CEnglishReportDlg::updateInfo(){
23、//选项存在,赋值,L是宏命令与TEXT()相同功能
24、m_strLable[i]= choose[index][i];
25、//获取GroupBox区域,并转换成对话框坐标
26、((CWnd*)GetDlgItem(IDC_STATIC_CHART))->GetWindowRect(rect);
27、函数1:响应ListBox的SelChange事件
28、void CEnglishReportDlg::OnLbnSelchangeListTopic()
29、// TODO:在此添加控件通知处理程序代码
30、index= m_listtopic.GetCurSel();
31、void CEnglishReportDlg::OnBnClickedButtonPre()
32、// TODO:在此添加控件通知处理程序代码
33、void CEnglishReportDlg::OnBnClickedButtonNext()
34、// TODO:在此添加控件通知处理程序代码
35、至此基本的功能都已经实现了,还差最后一步:
36、m_listtopic.AddString(topics[i]);
二、c++中的函数前面加个LRESULT是什么意思啊
1、在微软vc提供的头文件中有定义:
2、在windef.h中typedef LONG LRESULT;
3、所以LRESULT就是long,也就是长整形
4、之所以取名类LRESULT,L=>long
5、result表示结果,说明这个函数的返回值是某个结果。
6、C++语言的程序因为要体现高性能,所以都是编译型的。但其开发环境,为了方便测试,将调试环境做成解释型的。即开发过程中,以解释型的逐条语句执行方式来进行调试,以编译型的脱离开发环境而启动运行的方式来生成程序最终的执行代码。
7、生成程序是指将源码(C++语句)转换成一个可以运行的应用程序的过程。如果程序的编写是正确的,那么通常只需按一个功能键,即可搞定这个过程。
8、参考资料来源:百度百科-LRESULT
三、c++的函数指针是怎么用的呀
每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。
指向函数的指针变量的一般定义形式为:
数据类型(*指针变量名)(参数表);
1)函数指针的定义形式中的数据类型是指函数的返回值的类型。
int(*p)(int a, int b);//p是一个指向函数的指针变量,所指函数的返回值类型为整型
int*p(int a, int b);//p是函数名,此函数的返回值类型为整型指针
3)指向函数的指针变量不是固定指向哪一个函数的,而只是表示定义了一个这样类型的变量,它是专门用来存放函数的入口地址的;在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。
4)在给函数指针变量赋值时,只需给出函数名,而不必给出参数。
如函数max的原型为:int max(int x, int y);指针p的定义为:int(*p)(int a, int b);则p= max;的作用是将函数max的入口地址赋给指针变量p。这时,p就是指向函数max的指针变量,也就是p和max都指向函数的开头。
5)在一个程序中,指针变量p可以先后指向不同的函数,但一个函数不能赋给一个不一致的函数指针(即不能让一个函数指针指向与其类型不一致的函数)。
如有如下的函数:int fn1(int x, int y);int fn2(int x);
定义如下的函数指针:int(*p1)(int a, int b);int(*p2)(int a);
6)定义了一个函数指针并让它指向了一个函数后,对函数的调用可以通过函数名调用,也可以通过函数指针调用(即用指向函数的指针变量调用)。
如语句:c=(*p)(a, b);//表示调用由p指向的函数(max),实参为a,b,函数调用结束后得到的函数值赋给c。
7)函数指针只能指向函数的入口处,而不可能指向函数中间的某一条指令。不能用*(p+1)来表示函数的下一条指令。
8)函数指针变量常用的用途之一是把指针作为参数传递到其他函数
voidprocess(inti,intj,int(*p)(inta,intb));//应用函数指针
voidprocess(inti,intj,int(*p)(inta,intb))
cout<<p(i,j)<<endl;