MFC与柱状图
目前用于MFC画图表的库很少,据我所知只有Hight-Speed Charting(下简称HSC)和teechart,开源的就只有HSC,首先HSC确实是款很强大的库,但是它的柱状图画起来非常奇怪,x轴下标必须从0开始,必须连续,更不用说x轴坐标要为string的情况了,没这个接口。这导致我在画大部分柱状图时很不方便。商用的teechart没使用过,从官网下载的安装包打不开。我看到QT有很强很好用的控件,但是我的项目必须用MFC,我哭死。
Discrete Bar Chart v0.1
由于我在项目中经常会用到柱状图,于是我打算先自己写一个画柱状图的类——discrete bar chart。花了几天时间,终于出了第一个版本v0.1,有海量bug与不足之处,只是属于能用的范畴。下为一些示例图:
- 按y轴数据排序
- 关闭虚线
如你所见,坐标轴的图例甚至还没实现…
使用
1. 首先创建一个Picture Control控件
2. 在你的MFC对话框的OnPaint()函数中添加如下代码
void YourDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialogEx::OnPaint()
// 模拟数据
unordered_map<string, int> testData;
testData.emplace("apple", 31);
testData.emplace("B", 123);
testData.emplace("c", 70);
testData.emplace("1", 62);
testData.emplace("99", 79);
// 1. 获取控件用户区域
CRect clientRect;
GetDlgItem(IDC_STATIC)->GetClientRect(clientRect);
CDC* pDC = GetDlgItem(IDC_STATIC)->GetDC();
// 2.创建
DiscreteBarChart barChart;
barChart.create(pDC, clientRect);
// 3.设置一些参数
barChart.setTitle("discrete bar chart");
barChart.setDrawValueOnTop(true);
// 4. 绘图
barChart.Draw(testData);
CDialogEx::OnPaint();
GetDlgItem(IDC_STATIC)->ReleaseDC(mdc);
}
目前只有一个绘图接口,可接受一个unorder_map<std::string, int>
string
为x轴数据,int
为y轴数据。
void Draw(std::unordered_map<std::string, int>& data);
项目地址
后记
如果你对这个项目感兴趣,请留言让我知道,你们的热情就是我做下去的动力!
更新日志
2023/8/15
- 增加xy轴图例