目前存在以下数据 商品名称 苹果 收入 20 商品名称 香蕉 收入 23 商品名称 梨 收入13 如何使用CStatic继承来实现生成柱状图 给出完整的所有的代码,以及操作步骤
时间: 2024-06-09 21:04:25 浏览: 5
首先,需要在对话框上添加一个静态控件(CStatic),用于绘制柱状图。
操作步骤:
1. 打开 MFC 应用程序项目,创建一个对话框应用程序。
2. 在对话框上添加一个静态控件,并设置控件属性为黑色背景和白色边框。
3. 在对话框类中添加一个成员函数 DrawGraph(),用于绘制柱状图。
4. 在 OnInitDialog() 函数中调用 DrawGraph() 函数,实现初始化时的绘制。
5. 在对话框类中添加一个成员变量,用于存储商品收入数据。
6. 在 OnInitDialog() 函数中初始化商品收入数据。
7. 在 DrawGraph() 函数中使用商品收入数据绘制柱状图。
以下是完整的代码示例:
在对话框类的头文件中添加以下代码:
```cpp
#include <vector>
using namespace std;
class CMyDlg : public CDialogEx
{
public:
CMyDlg(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CMyDlg();
enum { IDD = IDD_MY_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
private:
CStatic m_stcGraph; // 静态控件
vector<pair<CString, int>> m_vecData; // 商品收入数据
void DrawGraph(); // 绘制柱状图
};
```
在对话框类的源文件中添加以下代码:
```cpp
#include "stdafx.h"
#include "MyApp.h"
#include "MyDlg.h"
#include "afxdialogex.h"
#include <algorithm>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MY_DIALOG, pParent)
{
}
CMyDlg::~CMyDlg()
{
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC_GRAPH, m_stcGraph);
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
ON_WM_PAINT()
END_MESSAGE_MAP()
BOOL CMyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 初始化商品收入数据
m_vecData.push_back(make_pair(_T("苹果"), 20));
m_vecData.push_back(make_pair(_T("香蕉"), 23));
m_vecData.push_back(make_pair(_T("梨"), 13));
// 绘制柱状图
DrawGraph();
return TRUE;
}
void CMyDlg::OnPaint()
{
CPaintDC dc(this); // 用于绘制的设备上下文
// 绘制静态控件的边框
CRect rect;
m_stcGraph.GetWindowRect(&rect);
ScreenToClient(&rect);
dc.DrawEdge(rect, EDGE_RAISED, BF_RECT);
// 绘制柱状图
DrawGraph();
}
void CMyDlg::DrawGraph()
{
// 获取静态控件的客户区大小
CRect rect;
m_stcGraph.GetClientRect(&rect);
// 计算柱状图的位置和大小
const int nMargin = 10; // 边距
const int nBarWidth = 20; // 柱状图宽度
const int nMaxValue = 30; // 最大值
int nBarHeight = 0;
int nBarLeft = nMargin;
int nBarTop = nMargin;
int nBarRight = nBarLeft + nBarWidth;
int nBarBottom = rect.Height() - nMargin;
int nXAxisLeft = nBarRight + nMargin;
int nXAxisTop = nBarBottom;
int nXAxisRight = rect.Width() - nMargin;
int nXAxisBottom = nBarBottom + nMargin;
int nYAxisLeft = nBarLeft;
int nYAxisTop = nBarTop;
int nYAxisRight = nXAxisLeft;
int nYAxisBottom = nBarBottom;
int nYAxisInterval = nMaxValue / 5;
// 绘制 Y 轴
CPen pen(PS_SOLID, 2, RGB(0, 0, 0));
CPen* pOldPen = dc.SelectObject(&pen);
for (int i = 0; i <= nMaxValue; i += nYAxisInterval)
{
nBarHeight = (nBarBottom - nBarTop) * i / nMaxValue;
dc.MoveTo(nYAxisRight, nBarBottom - nBarHeight);
dc.LineTo(nYAxisLeft, nBarBottom - nBarHeight);
}
dc.SelectObject(pOldPen);
// 绘制 X 轴
dc.MoveTo(nXAxisLeft, nXAxisTop);
dc.LineTo(nXAxisRight, nXAxisTop);
// 绘制柱状图
const int nTotalBars = static_cast<int>(m_vecData.size());
for (int i = 0; i < nTotalBars; ++i)
{
nBarHeight = (nBarBottom - nBarTop) * m_vecData[i].second / nMaxValue;
dc.Rectangle(nBarLeft, nBarBottom - nBarHeight, nBarRight, nBarBottom);
nBarLeft += nBarWidth + nMargin;
nBarRight += nBarWidth + nMargin;
}
}
```
在资源文件中添加以下代码:
```xml
IDD_MY_DIALOG DIALOGEX 0, 0, 250, 150
STYLE WS_SYSMENU | WS_VISIBLE | DS_MODALFRAME | DS_CENTER | DS_SHELLFONT
CAPTION "MyApp"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "商品收入柱状图", IDC_STATIC, 80, 10, 95, 14
CONTROL " ", IDC_STATIC_GRAPH, "Static", SS_BLACKFRAME | SS_NOTIFY, 10, 30, 230, 100
END
```
编译并运行程序,即可看到如下的柱状图:
![柱状图](https://img-blog.csdnimg.cn/2022030217070375.png)