【MFC】离散的柱状图 Discrete Bar Chart v0.1

本文作者介绍了在MFC项目中遇到的库(如HSC和teechart)局限性,然后开发了一个名为DiscreteBarChart的自定义柱状图类。文章详细展示了如何在MFC对话框中使用该类进行绘图,以及后续的更新和项目地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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轴数据排序

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

项目地址

github

后记

如果你对这个项目感兴趣,请留言让我知道,你们的热情就是我做下去的动力!

更新日志

2023/8/15
  • 增加xy轴图例
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值